diff --git a/CHANGELOG.md b/CHANGELOG.md index 038878c..41910d3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,21 @@ # Change Log -## Pre-Release (1.3.1) +## Pre-Release (1.3.2) + +- Allow changing the editor layout through the UI +- Improve the behavior of the information side panel +- Allow closing the information side panel +- Zoom to affected nodes when selecting a transformation +- Allow the minimap to be disabled through the UI +- Group transformations by type +- Allow all transformations of a certain type to be applied at once +- Fix a number of bugs related to property editing +- Allow configuring of default custom transformation directories +- Fix and improve Go-To-Source and Go-To-Generated-Code functionality + +## 1.2 + +### 1.2.1 - Allow offline editing of SDFGs (adding / deleting elements etc.) - Add auto-opening SDFG and instrumentation report preference to the extension @@ -10,8 +25,6 @@ - Improved error reporting from the DaCe daemon - Various bugfixes and improvements -## 1.2 - ### 1.2.0 - Allow loading of custom transformations diff --git a/backend/dace_vscode/transformations.py b/backend/dace_vscode/transformations.py index 517e83f..5f37b16 100644 --- a/backend/dace_vscode/transformations.py +++ b/backend/dace_vscode/transformations.py @@ -128,7 +128,7 @@ def reapply_history_until(sdfg_json, index): } -def apply_transformation(sdfg_json, transformation_json): +def apply_transformations(sdfg_json, transformation_json_list): old_meta = utils.disable_save_metadata() loaded = utils.load_sdfg_from_json(sdfg_json) @@ -136,34 +136,35 @@ def apply_transformation(sdfg_json, transformation_json): return loaded['error'] sdfg = loaded['sdfg'] - try: - transformation = serialize.from_json(transformation_json) - except Exception as e: - print(traceback.format_exc(), file=sys.stderr) - sys.stderr.flush() - return { - 'error': { - 'message': 'Failed to parse the applied transformation', - 'details': utils.get_exception_message(e), - }, - } - try: - target_sdfg = sdfg.sdfg_list[transformation.sdfg_id] - transformation._sdfg = target_sdfg - if isinstance(transformation, SubgraphTransformation): - sdfg.append_transformation(transformation) - transformation.apply(target_sdfg) - else: - transformation.apply_pattern(target_sdfg) - except Exception as e: - print(traceback.format_exc(), file=sys.stderr) - sys.stderr.flush() - return { - 'error': { - 'message': 'Failed to apply the transformation to the SDFG', - 'details': utils.get_exception_message(e), - }, - } + for transformation_json in transformation_json_list: + try: + transformation = serialize.from_json(transformation_json) + except Exception as e: + print(traceback.format_exc(), file=sys.stderr) + sys.stderr.flush() + return { + 'error': { + 'message': 'Failed to parse the applied transformation', + 'details': utils.get_exception_message(e), + }, + } + try: + target_sdfg = sdfg.sdfg_list[transformation.sdfg_id] + transformation._sdfg = target_sdfg + if isinstance(transformation, SubgraphTransformation): + sdfg.append_transformation(transformation) + transformation.apply(target_sdfg) + else: + transformation.apply_pattern(target_sdfg) + except Exception as e: + print(traceback.format_exc(), file=sys.stderr) + sys.stderr.flush() + return { + 'error': { + 'message': 'Failed to apply the transformation to the SDFG', + 'details': utils.get_exception_message(e), + }, + } new_sdfg = sdfg.to_json() utils.restore_save_metadata(old_meta) diff --git a/backend/run_dace.py b/backend/run_dace.py index 3ebde79..0102f05 100644 --- a/backend/run_dace.py +++ b/backend/run_dace.py @@ -383,11 +383,12 @@ def _add_transformations(): request_json = request.get_json() return transformations.add_custom_transformations(request_json['paths']) - @daemon.route('/apply_transformation', methods=['POST']) - def _apply_transformation(): + @daemon.route('/apply_transformations', methods=['POST']) + def _apply_transformations(): request_json = request.get_json() - return transformations.apply_transformation( - request_json['sdfg'], request_json['transformation']) + return transformations.apply_transformations( + request_json['sdfg'], request_json['transformations'] + ) @daemon.route('/expand_library_node', methods=['POST']) def _expand_library_node(): diff --git a/media/components/sdfv/index.html b/media/components/sdfv/index.html index 2fc684c..2b7b945 100644 --- a/media/components/sdfv/index.html +++ b/media/components/sdfv/index.html @@ -12,8 +12,8 @@ @@ -152,46 +152,54 @@ -
-
-
-
-
-
-
-
-
- - +
+
+
+
+
+
+ + +
-
-
-
-
-
- + +
+
+
+
+
+ +
- +
+
+ splitscreen
-
- -
+
+
+
diff --git a/package-lock.json b/package-lock.json index 3534126..cc86b46 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,18 +1,18 @@ { "name": "sdfv", - "version": "1.3.1", + "version": "1.3.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "sdfv", - "version": "1.3.1", + "version": "1.3.2", "dependencies": { "@popperjs/core": "^2.10.1", - "@spcl/sdfv": "^1.0.29-beta.12", + "@spcl/sdfv": "^1.0.29", "@types/dagre": "^0.7.46", "@types/jquery": "^3.5.6", - "bootstrap": "^5.0.2", + "bootstrap": "^5.2.0", "browserify-zlib": "^0.2.0", "dagre": "^0.8.5", "jquery": "^3.6.0", @@ -20,7 +20,6 @@ "material-icons": "^1.11.1", "monaco-editor": "^0.26.1", "process": "^0.11.10", - "split.js": "^1.6.4", "stream-browserify": "^3.0.0", "vscode-debugadapter": "^1.46.0" }, @@ -67,9 +66,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", "dev": true, "engines": { "node": ">=6.9.0" @@ -161,9 +160,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz", - "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.0.tgz", + "integrity": "sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA==", "dependencies": { "regenerator-runtime": "^0.13.4" }, @@ -181,14 +180,14 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", - "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.2.tgz", + "integrity": "sha512-AXYd23w1S/bv3fTs3Lz0vjiYemS08jWkI3hYyS9I1ry+0f+Yjs1wm+sU0BS8qDOPrBIkp4qHYC16I8uVtpLajQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.3.2", + "espree": "^9.4.0", "globals": "^13.15.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -198,12 +197,15 @@ }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.9.5", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", - "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.5.tgz", + "integrity": "sha512-XVVDtp+dVvRxMoxSiSfasYaG02VEe1qH5cKgMQJWhol6HwzbcqoCMJi8dAGoYAO57jhUyhI6cWuRiTcRaDaYug==", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", @@ -214,6 +216,29 @@ "node": ">=10.10.0" } }, + "node_modules/@humanwhocodes/gitignore-to-minimatch": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", + "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, "node_modules/@humanwhocodes/object-schema": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", @@ -269,9 +294,9 @@ "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.14", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz", - "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==", + "version": "0.3.15", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", + "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", @@ -675,18 +700,18 @@ } }, "node_modules/@popperjs/core": { - "version": "2.11.5", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.5.tgz", - "integrity": "sha512-9X2obfABZuDVLCgPK9aX0a/x4jaOEweTTWE2+9sr0Qqqevj2Uv5XorvusThmc9XGYpS9yI+fhh8RTafBtGposw==", + "version": "2.11.6", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz", + "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==", "funding": { "type": "opencollective", "url": "https://opencollective.com/popperjs" } }, "node_modules/@spcl/sdfv": { - "version": "1.0.29-beta.12", - "resolved": "https://registry.npmjs.org/@spcl/sdfv/-/sdfv-1.0.29-beta.12.tgz", - "integrity": "sha512-YhmKVJ4BRG3TUewWweTB6VqrVdlp/3N9lF0Q1JGA7Vc7LtdfhrmoLu0H4x36PneQvdrO/+N0tY3WGTmUMEe+tA==", + "version": "1.0.29", + "resolved": "https://registry.npmjs.org/@spcl/sdfv/-/sdfv-1.0.29.tgz", + "integrity": "sha512-lDZbENGYxzrXpIkjQSkWCUlCSSEql9DtmwXlBWMx+nE8qKmNNkoBnMuAYRcdYdJbSGnYYZXsbEcvyME+asgpXQ==", "hasInstallScript": true, "dependencies": { "@babel/runtime": "^7.17.2", @@ -720,9 +745,9 @@ } }, "node_modules/@types/dagre": { - "version": "0.7.47", - "resolved": "https://registry.npmjs.org/@types/dagre/-/dagre-0.7.47.tgz", - "integrity": "sha512-oX+3aRf7L6Cqq1MvbWmmD7FpAU/T8URwFFuHBagAiyHILn3i+RNZ35/tvyq28de+lZGY3W19BxJ7FeITQDO7aA==" + "version": "0.7.48", + "resolved": "https://registry.npmjs.org/@types/dagre/-/dagre-0.7.48.tgz", + "integrity": "sha512-rF3yXSwHIrDxEkN6edCE4TXknb5YSEpiXfLaspw1I08grC49ZFuAVGOQCmZGIuLUGoFgcqGlUFBL/XrpgYpQgw==" }, "node_modules/@types/earcut": { "version": "2.1.1", @@ -730,9 +755,9 @@ "integrity": "sha512-w8oigUCDjElRHRRrMvn/spybSMyX8MTkKA5Dv+tS1IE/TgmNZPqUYtvYBXGY8cieSE66gm+szeK+bnbxC2xHTQ==" }, "node_modules/@types/eslint": { - "version": "8.4.5", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.5.tgz", - "integrity": "sha512-dhsC09y1gpJWnK+Ff4SGvCuSnk9DaU0BJZSzOwa6GVSg65XtTugLBITDAAzRU5duGBoXBHpdR/9jHGxJjNflJQ==", + "version": "8.4.6", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.6.tgz", + "integrity": "sha512-/fqTbjxyFUaYNO7VcW5g+4npmqVACz1bB7RTHYuLj+PRjw9hrCwrUXVQFpChUS0JsyEFvMZ7U/PfmvWgxJhI9g==", "dev": true, "dependencies": { "@types/estree": "*", @@ -797,9 +822,9 @@ } }, "node_modules/@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", "dev": true }, "node_modules/@types/mocha": { @@ -826,22 +851,21 @@ "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==" }, "node_modules/@types/vscode": { - "version": "1.69.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.69.0.tgz", - "integrity": "sha512-RlzDAnGqUoo9wS6d4tthNyAdZLxOIddLiX3djMoWk29jFfSA1yJbIwr0epBYqqYarWB6s2Z+4VaZCQ80Jaa3kA==", + "version": "1.71.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.71.0.tgz", + "integrity": "sha512-nB50bBC9H/x2CpwW9FzRRRDrTZ7G0/POttJojvN/LiVfzTGfLyQIje1L1QRMdFXK9G41k5UJN/1B9S4of7CSzA==", "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.31.0.tgz", - "integrity": "sha512-VKW4JPHzG5yhYQrQ1AzXgVgX8ZAJEvCz0QI6mLRX4tf7rnFfh5D8SKm0Pq6w5PyNfAWJk6sv313+nEt3ohWMBQ==", + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.38.0.tgz", + "integrity": "sha512-GgHi/GNuUbTOeoJiEANi0oI6fF3gBQc3bGFYj40nnAPCbhrtEDf2rjBmefFadweBmO1Du1YovHeDP2h5JLhtTQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.31.0", - "@typescript-eslint/type-utils": "5.31.0", - "@typescript-eslint/utils": "5.31.0", + "@typescript-eslint/scope-manager": "5.38.0", + "@typescript-eslint/type-utils": "5.38.0", + "@typescript-eslint/utils": "5.38.0", "debug": "^4.3.4", - "functional-red-black-tree": "^1.0.1", "ignore": "^5.2.0", "regexpp": "^3.2.0", "semver": "^7.3.7", @@ -865,14 +889,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.31.0.tgz", - "integrity": "sha512-UStjQiZ9OFTFReTrN+iGrC6O/ko9LVDhreEK5S3edmXgR396JGq7CoX2TWIptqt/ESzU2iRKXAHfSF2WJFcWHw==", + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.38.0.tgz", + "integrity": "sha512-/F63giJGLDr0ms1Cr8utDAxP2SPiglaD6V+pCOcG35P2jCqdfR7uuEhz1GIC3oy4hkUF8xA1XSXmd9hOh/a5EA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.31.0", - "@typescript-eslint/types": "5.31.0", - "@typescript-eslint/typescript-estree": "5.31.0", + "@typescript-eslint/scope-manager": "5.38.0", + "@typescript-eslint/types": "5.38.0", + "@typescript-eslint/typescript-estree": "5.38.0", "debug": "^4.3.4" }, "engines": { @@ -892,13 +916,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.31.0.tgz", - "integrity": "sha512-8jfEzBYDBG88rcXFxajdVavGxb5/XKXyvWgvD8Qix3EEJLCFIdVloJw+r9ww0wbyNLOTYyBsR+4ALNGdlalLLg==", + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.38.0.tgz", + "integrity": "sha512-ByhHIuNyKD9giwkkLqzezZ9y5bALW8VNY6xXcP+VxoH4JBDKjU5WNnsiD4HJdglHECdV+lyaxhvQjTUbRboiTA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.31.0", - "@typescript-eslint/visitor-keys": "5.31.0" + "@typescript-eslint/types": "5.38.0", + "@typescript-eslint/visitor-keys": "5.38.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -909,12 +933,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.31.0.tgz", - "integrity": "sha512-7ZYqFbvEvYXFn9ax02GsPcEOmuWNg+14HIf4q+oUuLnMbpJ6eHAivCg7tZMVwzrIuzX3QCeAOqKoyMZCv5xe+w==", + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.38.0.tgz", + "integrity": "sha512-iZq5USgybUcj/lfnbuelJ0j3K9dbs1I3RICAJY9NZZpDgBYXmuUlYQGzftpQA9wC8cKgtS6DASTvF3HrXwwozA==", "dev": true, "dependencies": { - "@typescript-eslint/utils": "5.31.0", + "@typescript-eslint/typescript-estree": "5.38.0", + "@typescript-eslint/utils": "5.38.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -935,9 +960,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.31.0.tgz", - "integrity": "sha512-/f/rMaEseux+I4wmR6mfpM2wvtNZb1p9hAV77hWfuKc3pmaANp5dLAZSiE3/8oXTYTt3uV9KW5yZKJsMievp6g==", + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.38.0.tgz", + "integrity": "sha512-HHu4yMjJ7i3Cb+8NUuRCdOGu2VMkfmKyIJsOr9PfkBVYLYrtMCK/Ap50Rpov+iKpxDTfnqvDbuPLgBE5FwUNfA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -948,13 +973,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.31.0.tgz", - "integrity": "sha512-3S625TMcARX71wBc2qubHaoUwMEn+l9TCsaIzYI/ET31Xm2c9YQ+zhGgpydjorwQO9pLfR/6peTzS/0G3J/hDw==", + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.38.0.tgz", + "integrity": "sha512-6P0RuphkR+UuV7Avv7MU3hFoWaGcrgOdi8eTe1NwhMp2/GjUJoODBTRWzlHpZh6lFOaPmSvgxGlROa0Sg5Zbyg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.31.0", - "@typescript-eslint/visitor-keys": "5.31.0", + "@typescript-eslint/types": "5.38.0", + "@typescript-eslint/visitor-keys": "5.38.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -975,15 +1000,15 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.31.0.tgz", - "integrity": "sha512-kcVPdQS6VIpVTQ7QnGNKMFtdJdvnStkqS5LeALr4rcwx11G6OWb2HB17NMPnlRHvaZP38hL9iK8DdE9Fne7NYg==", + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.38.0.tgz", + "integrity": "sha512-6sdeYaBgk9Fh7N2unEXGz+D+som2QCQGPAf1SxrkEr+Z32gMreQ0rparXTNGRRfYUWk/JzbGdcM8NSSd6oqnTA==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.31.0", - "@typescript-eslint/types": "5.31.0", - "@typescript-eslint/typescript-estree": "5.31.0", + "@typescript-eslint/scope-manager": "5.38.0", + "@typescript-eslint/types": "5.38.0", + "@typescript-eslint/typescript-estree": "5.38.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" }, @@ -999,12 +1024,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.31.0.tgz", - "integrity": "sha512-ZK0jVxSjS4gnPirpVjXHz7mgdOsZUHzNYSfTw2yPa3agfbt9YfqaBiBZFSSxeBWnpWkzCxTfUpnzA3Vily/CSg==", + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.38.0.tgz", + "integrity": "sha512-MxnrdIyArnTi+XyFLR+kt/uNAcdOnmT+879os7qDRI+EYySR4crXJq9BXPfRzzLGq0wgxkwidrCJ9WCAoacm1w==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.31.0", + "@typescript-eslint/types": "5.38.0", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -1412,9 +1437,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.7", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.7.tgz", - "integrity": "sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA==", + "version": "10.4.12", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.12.tgz", + "integrity": "sha512-WrCGV9/b97Pa+jtwf5UGaRjgQIg7OK3D06GnoYoZNcG1Xb8Gt3EfuKjlhh9i/VtT16g6PYjZ69jdJ2g8FxSC4Q==", "dev": true, "funding": [ { @@ -1427,8 +1452,8 @@ } ], "dependencies": { - "browserslist": "^4.20.3", - "caniuse-lite": "^1.0.30001335", + "browserslist": "^4.21.4", + "caniuse-lite": "^1.0.30001407", "fraction.js": "^4.2.0", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", @@ -1526,9 +1551,9 @@ "dev": true }, "node_modules/bootstrap": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.2.0.tgz", - "integrity": "sha512-qlnS9GL6YZE6Wnef46GxGv1UpGGzAwO0aPL1yOjzDIJpeApeMvqV24iL+pjr2kU4dduoBA9fINKWKgMToobx9A==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.2.1.tgz", + "integrity": "sha512-UQi3v2NpVPEi1n35dmRRzBJFlgvWHYwyem6yHhuT6afYF+sziEt46McRbT//kVXZ7b1YUYEVGdXEH74Nx3xzGA==", "funding": [ { "type": "github", @@ -1540,7 +1565,7 @@ } ], "peerDependencies": { - "@popperjs/core": "^2.11.5" + "@popperjs/core": "^2.11.6" } }, "node_modules/brace-expansion": { @@ -1578,9 +1603,9 @@ } }, "node_modules/browserslist": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", - "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", + "version": "4.21.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", "dev": true, "funding": [ { @@ -1593,10 +1618,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001370", - "electron-to-chromium": "^1.4.202", + "caniuse-lite": "^1.0.30001400", + "electron-to-chromium": "^1.4.251", "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.5" + "update-browserslist-db": "^1.0.9" }, "bin": { "browserslist": "cli.js" @@ -1683,9 +1708,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001370", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001370.tgz", - "integrity": "sha512-3PDmaP56wz/qz7G508xzjx8C+MC2qEm4SYhSEzC9IBROo+dGXFWRuaXkWti0A9tuI00g+toiriVqxtWMgl350g==", + "version": "1.0.30001410", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001410.tgz", + "integrity": "sha512-QoblBnuE+rG0lc3Ur9ltP5q47lbguipa/ncNMyyGuqPk44FxbScWAeEO+k5fSQ8WekdAK4mWqNs1rADDAiN5xQ==", "dev": true, "funding": [ { @@ -1727,9 +1752,9 @@ } }, "node_modules/chart.js": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-3.8.2.tgz", - "integrity": "sha512-7rqSlHWMUKFyBDOJvmFGW2lxULtcwaPLegDjX/Nu5j6QybY+GCiQkEY+6cqHw62S5tcwXMD8Y+H5OBGoR7d+ZQ==" + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-3.9.1.tgz", + "integrity": "sha512-Ro2JbLmvg83gXF5F4sniaQ+lTbSv18E+TIf2cOeiH1Iqd2PGFOtem+DUufMZsCJwFE7ywPOpfXFBwRTGq7dh6w==" }, "node_modules/chartjs-plugin-annotation": { "version": "1.4.0", @@ -2063,9 +2088,9 @@ } }, "node_modules/decimal.js": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", - "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==" + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.1.tgz", + "integrity": "sha512-F29o+vci4DodHYT9UrR5IEbfBw9pE5eSapIJdTqXK5+6hq+t8VRxwQyKlW2i+KDKFkkJQRvFyI/QXD83h8LyQw==" }, "node_modules/deep-is": { "version": "0.1.4", @@ -2166,9 +2191,9 @@ "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==" }, "node_modules/electron-to-chromium": { - "version": "1.4.202", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.202.tgz", - "integrity": "sha512-JYsK2ex9lmQD27kj19fhXYxzFJ/phLAkLKHv49A5UY6kMRV2xED3qMMLg/voW/+0AR6wMiI+VxlmK9NDtdxlPA==", + "version": "1.4.261", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.261.tgz", + "integrity": "sha512-fVXliNUGJ7XUVJSAasPseBbVgJIeyw5M1xIkgXdTSRjlmCqBbiSTsEdLOCJS31Fc8B7CaloQ/BFAg8By3ODLdg==", "dev": true }, "node_modules/emoji-regex": { @@ -2221,30 +2246,31 @@ } }, "node_modules/es-abstract": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", - "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.3.tgz", + "integrity": "sha512-AyrnaKVpMzljIdwjzrj+LxGmj8ik2LckwXacHqrJJ/jxz6dDDBcZ7I7nlHM0FvEW8MfbWJwOd+yT2XzYW49Frw==", "dependencies": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.1", + "get-intrinsic": "^1.1.3", "get-symbol-description": "^1.0.0", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", + "is-callable": "^1.2.6", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.0", + "object-inspect": "^1.12.2", "object-keys": "^1.1.1", - "object.assign": "^4.1.2", + "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", "string.prototype.trimend": "^1.0.5", "string.prototype.trimstart": "^1.0.5", "unbox-primitive": "^1.0.2" @@ -2257,13 +2283,13 @@ } }, "node_modules/es-abstract/node_modules/object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, "engines": { @@ -2333,13 +2359,15 @@ } }, "node_modules/eslint": { - "version": "8.20.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.20.0.tgz", - "integrity": "sha512-d4ixhz5SKCa1D6SCPrivP7yYVi7nyD6A4vs6HIAul9ujBzcEmZVM3/0NN/yu5nKhmO1wjp5xQ46iRfmDGlOviA==", + "version": "8.24.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.24.0.tgz", + "integrity": "sha512-dWFaPhGhTAiPcCgm3f6LI2MBWbogMnTJzFBbhXVRQDJPkr9pGZvVjlVfXd+vyDcWPA2Ic9L2AXPIQM0+vk/cSQ==", "dev": true, "dependencies": { - "@eslint/eslintrc": "^1.3.0", - "@humanwhocodes/config-array": "^0.9.2", + "@eslint/eslintrc": "^1.3.2", + "@humanwhocodes/config-array": "^0.10.5", + "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", + "@humanwhocodes/module-importer": "^1.0.1", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -2349,18 +2377,21 @@ "eslint-scope": "^7.1.1", "eslint-utils": "^3.0.0", "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.2", + "espree": "^9.4.0", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", + "find-up": "^5.0.0", "glob-parent": "^6.0.1", "globals": "^13.15.0", + "globby": "^11.1.0", + "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", + "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", @@ -2371,8 +2402,7 @@ "regexpp": "^3.2.0", "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" + "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" @@ -2456,17 +2486,20 @@ } }, "node_modules/espree": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz", - "integrity": "sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==", + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", + "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", "dev": true, "dependencies": { - "acorn": "^8.7.1", + "acorn": "^8.8.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.3.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/esprima": { @@ -2563,9 +2596,9 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -2603,9 +2636,9 @@ "dev": true }, "node_modules/fastest-levenshtein": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.14.tgz", - "integrity": "sha512-tFfWHjnuUfKE186Tfgr+jtaFc0mZTApEgKDOeyN+FwOqRkO/zK/3h1AiRd8u8CY53owL3CUmGr/oI9p/RdyLTA==", + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", "dev": true, "engines": { "node": ">= 4.9.1" @@ -2682,15 +2715,19 @@ } }, "node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "dependencies": { - "locate-path": "^3.0.0" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/find-yarn-workspace-root": { @@ -2727,9 +2764,9 @@ } }, "node_modules/flatted": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.6.tgz", - "integrity": "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", "dev": true }, "node_modules/for-each": { @@ -2834,12 +2871,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true - }, "node_modules/functions-have-names": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", @@ -2858,9 +2889,9 @@ } }, "node_modules/get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", @@ -2962,6 +2993,12 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" }, + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, "node_modules/graphlib": { "version": "2.1.8", "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz", @@ -3288,9 +3325,9 @@ } }, "node_modules/is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "engines": { "node": ">= 0.4" }, @@ -3310,9 +3347,9 @@ } }, "node_modules/is-core-module": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", - "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", + "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", "dev": true, "dependencies": { "has": "^1.0.3" @@ -3607,9 +3644,9 @@ } }, "node_modules/jquery": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", - "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==" + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.1.tgz", + "integrity": "sha512-opJeO4nCucVnsjiXOE+/PcCgYw9Gwpvs/a6B1LL/lQhwWwpbVEVYDZ1FokFr8PRc7ghYlrFPuyHuiiDNTQxmcw==" }, "node_modules/jquery-editable-select": { "version": "2.2.5", @@ -3619,6 +3656,12 @@ "jquery": ">=1.1.1" } }, + "node_modules/js-sdsl": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.4.tgz", + "integrity": "sha512-Y2/yD55y5jteOAmY50JbUZYwk3CP3wnLPEZnlR1w9oKhITrBEtAxwuWKebFf8hMrPMgbYwFoWK/lH2sBkErELw==", + "dev": true + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -3750,16 +3793,18 @@ } }, "node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" + "p-locate": "^5.0.0" }, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/lodash": { @@ -3869,9 +3914,9 @@ } }, "node_modules/material-icons": { - "version": "1.11.7", - "resolved": "https://registry.npmjs.org/material-icons/-/material-icons-1.11.7.tgz", - "integrity": "sha512-M/cp6HvT9IWNKffU4NZ41+DQe5d9O1rxfBn5/hYf12RxLC09khMDWruDHOCzLbAub7SgNrAmxVNDpEmubxHUbg==" + "version": "1.11.11", + "resolved": "https://registry.npmjs.org/material-icons/-/material-icons-1.11.11.tgz", + "integrity": "sha512-8Cv9oJ4rqIYq0qHeX/Q3WU34qAXk8sXA9/sdg9BwPMKFhE0eGYPpVJMdSgmXNwmgxRxpMs68DceYVxx4jMNmbA==" }, "node_modules/mathjs": { "version": "10.6.4", @@ -4042,6 +4087,18 @@ "node": ">=0.8.0" } }, + "node_modules/mocha/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/mocha/node_modules/glob": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", @@ -4081,6 +4138,19 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/mocha/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/mocha/node_modules/minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -4099,6 +4169,42 @@ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true }, + "node_modules/mocha/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/mocha/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/mocha/node_modules/strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", @@ -4336,30 +4442,33 @@ } }, "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "dependencies": { - "p-try": "^2.0.0" + "yocto-queue": "^0.1.0" }, "engines": { - "node": ">=6" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "dependencies": { - "p-limit": "^2.0.0" + "p-limit": "^3.0.2" }, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-try": { @@ -4577,12 +4686,12 @@ } }, "node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/path-is-absolute": { @@ -4733,6 +4842,21 @@ "node": ">=8" } }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/pkg-dir/node_modules/p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", @@ -4745,19 +4869,10 @@ "node": ">=8" } }, - "node_modules/pkg-dir/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/postcss": { - "version": "8.4.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", - "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "version": "8.4.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz", + "integrity": "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==", "dev": true, "funding": [ { @@ -5161,10 +5276,23 @@ } ] }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/sass": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.54.0.tgz", - "integrity": "sha512-C4zp79GCXZfK0yoHZg+GxF818/aclhp9F48XBu/+bm9vXEVAYov9iU3FBVRMq3Hx3OA4jfKL+p2K9180mEh0xQ==", + "version": "1.55.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.55.0.tgz", + "integrity": "sha512-Pk+PMy7OGLs9WaxZGJMn7S96dvlyVBwwtToX895WmCpAOr5YiJYEUJfiJidMuKb613z2xNWcXCHEuOvjZbqC6A==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -5393,11 +5521,6 @@ "source-map": "^0.6.0" } }, - "node_modules/split.js": { - "version": "1.6.5", - "resolved": "https://registry.npmjs.org/split.js/-/split.js-1.6.5.tgz", - "integrity": "sha512-mPTnGCiS/RiuTNsVhCm9De9cCAUsrNFFviRbADdKiiV+Kk8HKp/0fWu7Kr8pi3/yBmsqLFHuXGT9UUZ+CNLwFw==" - }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -5555,9 +5678,9 @@ } }, "node_modules/terser": { - "version": "5.14.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", - "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.0.tgz", + "integrity": "sha512-L1BJiXVmheAQQy+as0oF3Pwtlo4s3Wi1X2zNZ2NxOB4wx9bdS9Vk67XQENLFdLYGCK/Z2di53mTj/hBafR+dTA==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.2", @@ -5573,16 +5696,16 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz", - "integrity": "sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ==", + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", + "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", "dev": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.7", + "@jridgewell/trace-mapping": "^0.3.14", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", "serialize-javascript": "^6.0.0", - "terser": "^5.7.2" + "terser": "^5.14.1" }, "engines": { "node": ">= 10.13.0" @@ -5667,9 +5790,9 @@ } }, "node_modules/ts-loader": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.3.1.tgz", - "integrity": "sha512-OkyShkcZTsTwyS3Kt7a4rsT/t2qvEVQuKCTg4LJmpj9fhFR7ukGdZwV6Qq3tRUkqcXtfGpPR7+hFKHCG/0d3Lw==", + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.1.tgz", + "integrity": "sha512-384TYAqGs70rn9F0VBnh6BPTfhga7yFNdC5gXbQpDrBj9/KsT4iRkGqKXhziofHOlE2j6YEaiTYVGKKvPhGWvw==", "dev": true, "dependencies": { "chalk": "^4.1.0", @@ -5739,9 +5862,9 @@ } }, "node_modules/typescript": { - "version": "4.7.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", - "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.3.tgz", + "integrity": "sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -5822,9 +5945,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz", - "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.9.tgz", + "integrity": "sha512-/xsqn21EGVdXI3EXSum1Yckj3ZVZugqyOZQ/CxYPBD/R+ko9NSUScf8tFF4dOKY+2pvSSJA/S+5B8s4Zr4kyvg==", "dev": true, "funding": [ { @@ -5888,12 +6011,6 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, "node_modules/vscode-debugadapter": { "version": "1.51.0", "resolved": "https://registry.npmjs.org/vscode-debugadapter/-/vscode-debugadapter-1.51.0.tgz", @@ -6325,6 +6442,67 @@ "node": ">=6" } }, + "node_modules/yargs/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yargs/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/yargs/node_modules/string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", @@ -6350,6 +6528,18 @@ "engines": { "node": ">=6" } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } }, "dependencies": { @@ -6363,9 +6553,9 @@ } }, "@babel/helper-validator-identifier": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", - "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", "dev": true }, "@babel/highlight": { @@ -6438,9 +6628,9 @@ } }, "@babel/runtime": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz", - "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.0.tgz", + "integrity": "sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA==", "requires": { "regenerator-runtime": "^0.13.4" } @@ -6452,14 +6642,14 @@ "dev": true }, "@eslint/eslintrc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz", - "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.2.tgz", + "integrity": "sha512-AXYd23w1S/bv3fTs3Lz0vjiYemS08jWkI3hYyS9I1ry+0f+Yjs1wm+sU0BS8qDOPrBIkp4qHYC16I8uVtpLajQ==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.3.2", + "espree": "^9.4.0", "globals": "^13.15.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -6469,9 +6659,9 @@ } }, "@humanwhocodes/config-array": { - "version": "0.9.5", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz", - "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==", + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.5.tgz", + "integrity": "sha512-XVVDtp+dVvRxMoxSiSfasYaG02VEe1qH5cKgMQJWhol6HwzbcqoCMJi8dAGoYAO57jhUyhI6cWuRiTcRaDaYug==", "dev": true, "requires": { "@humanwhocodes/object-schema": "^1.2.1", @@ -6479,6 +6669,18 @@ "minimatch": "^3.0.4" } }, + "@humanwhocodes/gitignore-to-minimatch": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", + "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", + "dev": true + }, + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true + }, "@humanwhocodes/object-schema": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", @@ -6525,9 +6727,9 @@ "dev": true }, "@jridgewell/trace-mapping": { - "version": "0.3.14", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz", - "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==", + "version": "0.3.15", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", + "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", "dev": true, "requires": { "@jridgewell/resolve-uri": "^3.0.3", @@ -6778,14 +6980,14 @@ } }, "@popperjs/core": { - "version": "2.11.5", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.5.tgz", - "integrity": "sha512-9X2obfABZuDVLCgPK9aX0a/x4jaOEweTTWE2+9sr0Qqqevj2Uv5XorvusThmc9XGYpS9yI+fhh8RTafBtGposw==" + "version": "2.11.6", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz", + "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==" }, "@spcl/sdfv": { - "version": "1.0.29-beta.12", - "resolved": "https://registry.npmjs.org/@spcl/sdfv/-/sdfv-1.0.29-beta.12.tgz", - "integrity": "sha512-YhmKVJ4BRG3TUewWweTB6VqrVdlp/3N9lF0Q1JGA7Vc7LtdfhrmoLu0H4x36PneQvdrO/+N0tY3WGTmUMEe+tA==", + "version": "1.0.29", + "resolved": "https://registry.npmjs.org/@spcl/sdfv/-/sdfv-1.0.29.tgz", + "integrity": "sha512-lDZbENGYxzrXpIkjQSkWCUlCSSEql9DtmwXlBWMx+nE8qKmNNkoBnMuAYRcdYdJbSGnYYZXsbEcvyME+asgpXQ==", "requires": { "@babel/runtime": "^7.17.2", "@types/mathjs": "^6.0.11", @@ -6812,9 +7014,9 @@ "dev": true }, "@types/dagre": { - "version": "0.7.47", - "resolved": "https://registry.npmjs.org/@types/dagre/-/dagre-0.7.47.tgz", - "integrity": "sha512-oX+3aRf7L6Cqq1MvbWmmD7FpAU/T8URwFFuHBagAiyHILn3i+RNZ35/tvyq28de+lZGY3W19BxJ7FeITQDO7aA==" + "version": "0.7.48", + "resolved": "https://registry.npmjs.org/@types/dagre/-/dagre-0.7.48.tgz", + "integrity": "sha512-rF3yXSwHIrDxEkN6edCE4TXknb5YSEpiXfLaspw1I08grC49ZFuAVGOQCmZGIuLUGoFgcqGlUFBL/XrpgYpQgw==" }, "@types/earcut": { "version": "2.1.1", @@ -6822,9 +7024,9 @@ "integrity": "sha512-w8oigUCDjElRHRRrMvn/spybSMyX8MTkKA5Dv+tS1IE/TgmNZPqUYtvYBXGY8cieSE66gm+szeK+bnbxC2xHTQ==" }, "@types/eslint": { - "version": "8.4.5", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.5.tgz", - "integrity": "sha512-dhsC09y1gpJWnK+Ff4SGvCuSnk9DaU0BJZSzOwa6GVSg65XtTugLBITDAAzRU5duGBoXBHpdR/9jHGxJjNflJQ==", + "version": "8.4.6", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.6.tgz", + "integrity": "sha512-/fqTbjxyFUaYNO7VcW5g+4npmqVACz1bB7RTHYuLj+PRjw9hrCwrUXVQFpChUS0JsyEFvMZ7U/PfmvWgxJhI9g==", "dev": true, "requires": { "@types/estree": "*", @@ -6889,9 +7091,9 @@ } }, "@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", "dev": true }, "@types/mocha": { @@ -6918,22 +7120,21 @@ "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==" }, "@types/vscode": { - "version": "1.69.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.69.0.tgz", - "integrity": "sha512-RlzDAnGqUoo9wS6d4tthNyAdZLxOIddLiX3djMoWk29jFfSA1yJbIwr0epBYqqYarWB6s2Z+4VaZCQ80Jaa3kA==", + "version": "1.71.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.71.0.tgz", + "integrity": "sha512-nB50bBC9H/x2CpwW9FzRRRDrTZ7G0/POttJojvN/LiVfzTGfLyQIje1L1QRMdFXK9G41k5UJN/1B9S4of7CSzA==", "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "5.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.31.0.tgz", - "integrity": "sha512-VKW4JPHzG5yhYQrQ1AzXgVgX8ZAJEvCz0QI6mLRX4tf7rnFfh5D8SKm0Pq6w5PyNfAWJk6sv313+nEt3ohWMBQ==", + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.38.0.tgz", + "integrity": "sha512-GgHi/GNuUbTOeoJiEANi0oI6fF3gBQc3bGFYj40nnAPCbhrtEDf2rjBmefFadweBmO1Du1YovHeDP2h5JLhtTQ==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.31.0", - "@typescript-eslint/type-utils": "5.31.0", - "@typescript-eslint/utils": "5.31.0", + "@typescript-eslint/scope-manager": "5.38.0", + "@typescript-eslint/type-utils": "5.38.0", + "@typescript-eslint/utils": "5.38.0", "debug": "^4.3.4", - "functional-red-black-tree": "^1.0.1", "ignore": "^5.2.0", "regexpp": "^3.2.0", "semver": "^7.3.7", @@ -6941,52 +7142,53 @@ } }, "@typescript-eslint/parser": { - "version": "5.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.31.0.tgz", - "integrity": "sha512-UStjQiZ9OFTFReTrN+iGrC6O/ko9LVDhreEK5S3edmXgR396JGq7CoX2TWIptqt/ESzU2iRKXAHfSF2WJFcWHw==", + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.38.0.tgz", + "integrity": "sha512-/F63giJGLDr0ms1Cr8utDAxP2SPiglaD6V+pCOcG35P2jCqdfR7uuEhz1GIC3oy4hkUF8xA1XSXmd9hOh/a5EA==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.31.0", - "@typescript-eslint/types": "5.31.0", - "@typescript-eslint/typescript-estree": "5.31.0", + "@typescript-eslint/scope-manager": "5.38.0", + "@typescript-eslint/types": "5.38.0", + "@typescript-eslint/typescript-estree": "5.38.0", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "5.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.31.0.tgz", - "integrity": "sha512-8jfEzBYDBG88rcXFxajdVavGxb5/XKXyvWgvD8Qix3EEJLCFIdVloJw+r9ww0wbyNLOTYyBsR+4ALNGdlalLLg==", + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.38.0.tgz", + "integrity": "sha512-ByhHIuNyKD9giwkkLqzezZ9y5bALW8VNY6xXcP+VxoH4JBDKjU5WNnsiD4HJdglHECdV+lyaxhvQjTUbRboiTA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.31.0", - "@typescript-eslint/visitor-keys": "5.31.0" + "@typescript-eslint/types": "5.38.0", + "@typescript-eslint/visitor-keys": "5.38.0" } }, "@typescript-eslint/type-utils": { - "version": "5.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.31.0.tgz", - "integrity": "sha512-7ZYqFbvEvYXFn9ax02GsPcEOmuWNg+14HIf4q+oUuLnMbpJ6eHAivCg7tZMVwzrIuzX3QCeAOqKoyMZCv5xe+w==", + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.38.0.tgz", + "integrity": "sha512-iZq5USgybUcj/lfnbuelJ0j3K9dbs1I3RICAJY9NZZpDgBYXmuUlYQGzftpQA9wC8cKgtS6DASTvF3HrXwwozA==", "dev": true, "requires": { - "@typescript-eslint/utils": "5.31.0", + "@typescript-eslint/typescript-estree": "5.38.0", + "@typescript-eslint/utils": "5.38.0", "debug": "^4.3.4", "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "5.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.31.0.tgz", - "integrity": "sha512-/f/rMaEseux+I4wmR6mfpM2wvtNZb1p9hAV77hWfuKc3pmaANp5dLAZSiE3/8oXTYTt3uV9KW5yZKJsMievp6g==", + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.38.0.tgz", + "integrity": "sha512-HHu4yMjJ7i3Cb+8NUuRCdOGu2VMkfmKyIJsOr9PfkBVYLYrtMCK/Ap50Rpov+iKpxDTfnqvDbuPLgBE5FwUNfA==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.31.0.tgz", - "integrity": "sha512-3S625TMcARX71wBc2qubHaoUwMEn+l9TCsaIzYI/ET31Xm2c9YQ+zhGgpydjorwQO9pLfR/6peTzS/0G3J/hDw==", + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.38.0.tgz", + "integrity": "sha512-6P0RuphkR+UuV7Avv7MU3hFoWaGcrgOdi8eTe1NwhMp2/GjUJoODBTRWzlHpZh6lFOaPmSvgxGlROa0Sg5Zbyg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.31.0", - "@typescript-eslint/visitor-keys": "5.31.0", + "@typescript-eslint/types": "5.38.0", + "@typescript-eslint/visitor-keys": "5.38.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -6995,26 +7197,26 @@ } }, "@typescript-eslint/utils": { - "version": "5.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.31.0.tgz", - "integrity": "sha512-kcVPdQS6VIpVTQ7QnGNKMFtdJdvnStkqS5LeALr4rcwx11G6OWb2HB17NMPnlRHvaZP38hL9iK8DdE9Fne7NYg==", + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.38.0.tgz", + "integrity": "sha512-6sdeYaBgk9Fh7N2unEXGz+D+som2QCQGPAf1SxrkEr+Z32gMreQ0rparXTNGRRfYUWk/JzbGdcM8NSSd6oqnTA==", "dev": true, "requires": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.31.0", - "@typescript-eslint/types": "5.31.0", - "@typescript-eslint/typescript-estree": "5.31.0", + "@typescript-eslint/scope-manager": "5.38.0", + "@typescript-eslint/types": "5.38.0", + "@typescript-eslint/typescript-estree": "5.38.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" } }, "@typescript-eslint/visitor-keys": { - "version": "5.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.31.0.tgz", - "integrity": "sha512-ZK0jVxSjS4gnPirpVjXHz7mgdOsZUHzNYSfTw2yPa3agfbt9YfqaBiBZFSSxeBWnpWkzCxTfUpnzA3Vily/CSg==", + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.38.0.tgz", + "integrity": "sha512-MxnrdIyArnTi+XyFLR+kt/uNAcdOnmT+879os7qDRI+EYySR4crXJq9BXPfRzzLGq0wgxkwidrCJ9WCAoacm1w==", "dev": true, "requires": { - "@typescript-eslint/types": "5.31.0", + "@typescript-eslint/types": "5.38.0", "eslint-visitor-keys": "^3.3.0" } }, @@ -7349,13 +7551,13 @@ } }, "autoprefixer": { - "version": "10.4.7", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.7.tgz", - "integrity": "sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA==", + "version": "10.4.12", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.12.tgz", + "integrity": "sha512-WrCGV9/b97Pa+jtwf5UGaRjgQIg7OK3D06GnoYoZNcG1Xb8Gt3EfuKjlhh9i/VtT16g6PYjZ69jdJ2g8FxSC4Q==", "dev": true, "requires": { - "browserslist": "^4.20.3", - "caniuse-lite": "^1.0.30001335", + "browserslist": "^4.21.4", + "caniuse-lite": "^1.0.30001407", "fraction.js": "^4.2.0", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", @@ -7412,9 +7614,9 @@ "dev": true }, "bootstrap": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.2.0.tgz", - "integrity": "sha512-qlnS9GL6YZE6Wnef46GxGv1UpGGzAwO0aPL1yOjzDIJpeApeMvqV24iL+pjr2kU4dduoBA9fINKWKgMToobx9A==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.2.1.tgz", + "integrity": "sha512-UQi3v2NpVPEi1n35dmRRzBJFlgvWHYwyem6yHhuT6afYF+sziEt46McRbT//kVXZ7b1YUYEVGdXEH74Nx3xzGA==", "requires": {} }, "brace-expansion": { @@ -7449,15 +7651,15 @@ } }, "browserslist": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", - "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", + "version": "4.21.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001370", - "electron-to-chromium": "^1.4.202", + "caniuse-lite": "^1.0.30001400", + "electron-to-chromium": "^1.4.251", "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.5" + "update-browserslist-db": "^1.0.9" } }, "buffer": { @@ -7509,9 +7711,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001370", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001370.tgz", - "integrity": "sha512-3PDmaP56wz/qz7G508xzjx8C+MC2qEm4SYhSEzC9IBROo+dGXFWRuaXkWti0A9tuI00g+toiriVqxtWMgl350g==", + "version": "1.0.30001410", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001410.tgz", + "integrity": "sha512-QoblBnuE+rG0lc3Ur9ltP5q47lbguipa/ncNMyyGuqPk44FxbScWAeEO+k5fSQ8WekdAK4mWqNs1rADDAiN5xQ==", "dev": true }, "chainsaw": { @@ -7534,9 +7736,9 @@ } }, "chart.js": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-3.8.2.tgz", - "integrity": "sha512-7rqSlHWMUKFyBDOJvmFGW2lxULtcwaPLegDjX/Nu5j6QybY+GCiQkEY+6cqHw62S5tcwXMD8Y+H5OBGoR7d+ZQ==" + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-3.9.1.tgz", + "integrity": "sha512-Ro2JbLmvg83gXF5F4sniaQ+lTbSv18E+TIf2cOeiH1Iqd2PGFOtem+DUufMZsCJwFE7ywPOpfXFBwRTGq7dh6w==" }, "chartjs-plugin-annotation": { "version": "1.4.0", @@ -7786,9 +7988,9 @@ "dev": true }, "decimal.js": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", - "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==" + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.1.tgz", + "integrity": "sha512-F29o+vci4DodHYT9UrR5IEbfBw9pE5eSapIJdTqXK5+6hq+t8VRxwQyKlW2i+KDKFkkJQRvFyI/QXD83h8LyQw==" }, "deep-is": { "version": "0.1.4", @@ -7876,9 +8078,9 @@ "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==" }, "electron-to-chromium": { - "version": "1.4.202", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.202.tgz", - "integrity": "sha512-JYsK2ex9lmQD27kj19fhXYxzFJ/phLAkLKHv49A5UY6kMRV2xED3qMMLg/voW/+0AR6wMiI+VxlmK9NDtdxlPA==", + "version": "1.4.261", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.261.tgz", + "integrity": "sha512-fVXliNUGJ7XUVJSAasPseBbVgJIeyw5M1xIkgXdTSRjlmCqBbiSTsEdLOCJS31Fc8B7CaloQ/BFAg8By3ODLdg==", "dev": true }, "emoji-regex": { @@ -7919,43 +8121,44 @@ } }, "es-abstract": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", - "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.3.tgz", + "integrity": "sha512-AyrnaKVpMzljIdwjzrj+LxGmj8ik2LckwXacHqrJJ/jxz6dDDBcZ7I7nlHM0FvEW8MfbWJwOd+yT2XzYW49Frw==", "requires": { "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.1", + "get-intrinsic": "^1.1.3", "get-symbol-description": "^1.0.0", "has": "^1.0.3", "has-property-descriptors": "^1.0.0", "has-symbols": "^1.0.3", "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", + "is-callable": "^1.2.6", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.0", + "object-inspect": "^1.12.2", "object-keys": "^1.1.1", - "object.assign": "^4.1.2", + "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", "string.prototype.trimend": "^1.0.5", "string.prototype.trimstart": "^1.0.5", "unbox-primitive": "^1.0.2" }, "dependencies": { "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", "object-keys": "^1.1.1" } } @@ -8006,13 +8209,15 @@ "dev": true }, "eslint": { - "version": "8.20.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.20.0.tgz", - "integrity": "sha512-d4ixhz5SKCa1D6SCPrivP7yYVi7nyD6A4vs6HIAul9ujBzcEmZVM3/0NN/yu5nKhmO1wjp5xQ46iRfmDGlOviA==", + "version": "8.24.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.24.0.tgz", + "integrity": "sha512-dWFaPhGhTAiPcCgm3f6LI2MBWbogMnTJzFBbhXVRQDJPkr9pGZvVjlVfXd+vyDcWPA2Ic9L2AXPIQM0+vk/cSQ==", "dev": true, "requires": { - "@eslint/eslintrc": "^1.3.0", - "@humanwhocodes/config-array": "^0.9.2", + "@eslint/eslintrc": "^1.3.2", + "@humanwhocodes/config-array": "^0.10.5", + "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", + "@humanwhocodes/module-importer": "^1.0.1", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -8022,18 +8227,21 @@ "eslint-scope": "^7.1.1", "eslint-utils": "^3.0.0", "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.2", + "espree": "^9.4.0", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", + "find-up": "^5.0.0", "glob-parent": "^6.0.1", "globals": "^13.15.0", + "globby": "^11.1.0", + "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", + "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", @@ -8044,8 +8252,7 @@ "regexpp": "^3.2.0", "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" + "text-table": "^0.2.0" }, "dependencies": { "eslint-scope": { @@ -8100,12 +8307,12 @@ "dev": true }, "espree": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz", - "integrity": "sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==", + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", + "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", "dev": true, "requires": { - "acorn": "^8.7.1", + "acorn": "^8.8.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.3.0" } @@ -8180,9 +8387,9 @@ "dev": true }, "fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -8216,9 +8423,9 @@ "dev": true }, "fastest-levenshtein": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.14.tgz", - "integrity": "sha512-tFfWHjnuUfKE186Tfgr+jtaFc0mZTApEgKDOeyN+FwOqRkO/zK/3h1AiRd8u8CY53owL3CUmGr/oI9p/RdyLTA==", + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", "dev": true }, "fastq": { @@ -8271,12 +8478,13 @@ } }, "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "requires": { - "locate-path": "^3.0.0" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" } }, "find-yarn-workspace-root": { @@ -8307,9 +8515,9 @@ } }, "flatted": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.6.tgz", - "integrity": "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", "dev": true }, "for-each": { @@ -8386,12 +8594,6 @@ "functions-have-names": "^1.2.2" } }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true - }, "functions-have-names": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", @@ -8404,9 +8606,9 @@ "dev": true }, "get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", @@ -8478,6 +8680,12 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" }, + "grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, "graphlib": { "version": "2.1.8", "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz", @@ -8687,9 +8895,9 @@ "dev": true }, "is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==" + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==" }, "is-ci": { "version": "2.0.0", @@ -8700,9 +8908,9 @@ } }, "is-core-module": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", - "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", + "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", "dev": true, "requires": { "has": "^1.0.3" @@ -8897,9 +9105,9 @@ } }, "jquery": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", - "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==" + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.1.tgz", + "integrity": "sha512-opJeO4nCucVnsjiXOE+/PcCgYw9Gwpvs/a6B1LL/lQhwWwpbVEVYDZ1FokFr8PRc7ghYlrFPuyHuiiDNTQxmcw==" }, "jquery-editable-select": { "version": "2.2.5", @@ -8909,6 +9117,12 @@ "jquery": ">=1.1.1" } }, + "js-sdsl": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.4.tgz", + "integrity": "sha512-Y2/yD55y5jteOAmY50JbUZYwk3CP3wnLPEZnlR1w9oKhITrBEtAxwuWKebFf8hMrPMgbYwFoWK/lH2sBkErELw==", + "dev": true + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -9016,13 +9230,12 @@ } }, "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" + "p-locate": "^5.0.0" } }, "lodash": { @@ -9113,9 +9326,9 @@ } }, "material-icons": { - "version": "1.11.7", - "resolved": "https://registry.npmjs.org/material-icons/-/material-icons-1.11.7.tgz", - "integrity": "sha512-M/cp6HvT9IWNKffU4NZ41+DQe5d9O1rxfBn5/hYf12RxLC09khMDWruDHOCzLbAub7SgNrAmxVNDpEmubxHUbg==" + "version": "1.11.11", + "resolved": "https://registry.npmjs.org/material-icons/-/material-icons-1.11.11.tgz", + "integrity": "sha512-8Cv9oJ4rqIYq0qHeX/Q3WU34qAXk8sXA9/sdg9BwPMKFhE0eGYPpVJMdSgmXNwmgxRxpMs68DceYVxx4jMNmbA==" }, "mathjs": { "version": "10.6.4", @@ -9247,6 +9460,15 @@ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, "glob": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", @@ -9277,6 +9499,16 @@ "esprima": "^4.0.0" } }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -9292,6 +9524,30 @@ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true + }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", @@ -9473,21 +9729,21 @@ "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==" }, "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "requires": { - "p-try": "^2.0.0" + "yocto-queue": "^0.1.0" } }, "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "requires": { - "p-limit": "^2.0.0" + "p-limit": "^3.0.2" } }, "p-try": { @@ -9650,9 +9906,9 @@ } }, "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true }, "path-is-absolute": { @@ -9772,6 +10028,15 @@ "p-locate": "^4.1.0" } }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, "p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", @@ -9780,19 +10045,13 @@ "requires": { "p-limit": "^2.2.0" } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true } } }, "postcss": { - "version": "8.4.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", - "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "version": "8.4.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz", + "integrity": "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==", "dev": true, "requires": { "nanoid": "^3.3.4", @@ -10041,10 +10300,20 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, + "safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + } + }, "sass": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.54.0.tgz", - "integrity": "sha512-C4zp79GCXZfK0yoHZg+GxF818/aclhp9F48XBu/+bm9vXEVAYov9iU3FBVRMq3Hx3OA4jfKL+p2K9180mEh0xQ==", + "version": "1.55.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.55.0.tgz", + "integrity": "sha512-Pk+PMy7OGLs9WaxZGJMn7S96dvlyVBwwtToX895WmCpAOr5YiJYEUJfiJidMuKb613z2xNWcXCHEuOvjZbqC6A==", "dev": true, "requires": { "chokidar": ">=3.0.0 <4.0.0", @@ -10200,11 +10469,6 @@ "source-map": "^0.6.0" } }, - "split.js": { - "version": "1.6.5", - "resolved": "https://registry.npmjs.org/split.js/-/split.js-1.6.5.tgz", - "integrity": "sha512-mPTnGCiS/RiuTNsVhCm9De9cCAUsrNFFviRbADdKiiV+Kk8HKp/0fWu7Kr8pi3/yBmsqLFHuXGT9UUZ+CNLwFw==" - }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -10319,9 +10583,9 @@ "dev": true }, "terser": { - "version": "5.14.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", - "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.0.tgz", + "integrity": "sha512-L1BJiXVmheAQQy+as0oF3Pwtlo4s3Wi1X2zNZ2NxOB4wx9bdS9Vk67XQENLFdLYGCK/Z2di53mTj/hBafR+dTA==", "dev": true, "requires": { "@jridgewell/source-map": "^0.3.2", @@ -10331,16 +10595,16 @@ } }, "terser-webpack-plugin": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz", - "integrity": "sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ==", + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", + "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", "dev": true, "requires": { - "@jridgewell/trace-mapping": "^0.3.7", + "@jridgewell/trace-mapping": "^0.3.14", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", "serialize-javascript": "^6.0.0", - "terser": "^5.7.2" + "terser": "^5.14.1" }, "dependencies": { "schema-utils": { @@ -10390,9 +10654,9 @@ "dev": true }, "ts-loader": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.3.1.tgz", - "integrity": "sha512-OkyShkcZTsTwyS3Kt7a4rsT/t2qvEVQuKCTg4LJmpj9fhFR7ukGdZwV6Qq3tRUkqcXtfGpPR7+hFKHCG/0d3Lw==", + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.1.tgz", + "integrity": "sha512-384TYAqGs70rn9F0VBnh6BPTfhga7yFNdC5gXbQpDrBj9/KsT4iRkGqKXhziofHOlE2j6YEaiTYVGKKvPhGWvw==", "dev": true, "requires": { "chalk": "^4.1.0", @@ -10437,9 +10701,9 @@ "integrity": "sha512-bctQIOqx2iVbWGDGPWwIm18QScpu2XRmkC19D8rQGFsjKSgteq/o1hTZvIG/wuDq8fanpBDrLkLq+aEN/6y5XQ==" }, "typescript": { - "version": "4.7.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", - "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.3.tgz", + "integrity": "sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig==", "dev": true }, "unbox-primitive": { @@ -10509,9 +10773,9 @@ } }, "update-browserslist-db": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz", - "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.9.tgz", + "integrity": "sha512-/xsqn21EGVdXI3EXSum1Yckj3ZVZugqyOZQ/CxYPBD/R+ko9NSUScf8tFF4dOKY+2pvSSJA/S+5B8s4Zr4kyvg==", "dev": true, "requires": { "escalade": "^3.1.1", @@ -10561,12 +10825,6 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, "vscode-debugadapter": { "version": "1.51.0", "resolved": "https://registry.npmjs.org/vscode-debugadapter/-/vscode-debugadapter-1.51.0.tgz", @@ -10870,6 +11128,49 @@ "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true + }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", @@ -10912,6 +11213,12 @@ "lodash": "^4.17.15", "yargs": "^13.3.0" } + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true } } } diff --git a/package.json b/package.json index c4a06eb..91f7aff 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "sdfv", "displayName": "DaCe SDFG Editor", "description": "Transform and optimize data-centric programs with a click of a button", - "version": "1.3.1", + "version": "1.3.2", "engines": { "vscode": "^1.68.0" }, @@ -187,6 +187,11 @@ "default": "", "description": "Python interpreter path to use for the DaCe backend. Leave blank to use your default Python interpreter." }, + "dace.optimization.customTransformationsPaths": { + "type": "array", + "default": [], + "description": "Paths to search for custom transformations" + }, "dace.general.autoOpenSdfgs": { "type": "string", "default": "Ask", @@ -436,7 +441,7 @@ "title": "Preview" }, { - "command": "sdfg.applyTransformation", + "command": "sdfg.applyTransformations", "title": "Apply" }, { @@ -483,7 +488,7 @@ "when": "false" }, { - "command": "sdfg.applyTransformation", + "command": "sdfg.applyTransformations", "when": "false" }, { @@ -638,10 +643,10 @@ }, "dependencies": { "@popperjs/core": "^2.10.1", - "@spcl/sdfv": "^1.0.29-beta.12", + "@spcl/sdfv": "^1.0.29", "@types/dagre": "^0.7.46", "@types/jquery": "^3.5.6", - "bootstrap": "^5.0.2", + "bootstrap": "^5.2.0", "browserify-zlib": "^0.2.0", "dagre": "^0.8.5", "jquery": "^3.6.0", @@ -649,7 +654,6 @@ "material-icons": "^1.11.1", "monaco-editor": "^0.26.1", "process": "^0.11.10", - "split.js": "^1.6.4", "stream-browserify": "^3.0.0", "vscode-debugadapter": "^1.46.0" } diff --git a/src/components/sdfg_viewer.ts b/src/components/sdfg_viewer.ts index 73d9879..03f156f 100644 --- a/src/components/sdfg_viewer.ts +++ b/src/components/sdfg_viewer.ts @@ -12,6 +12,7 @@ import { BaseComponent } from './base_component'; import { ComponentMessageHandler } from './messaging/component_message_handler'; import { TransformationListProvider } from './transformation_list'; import { getCppRange, SDFGDebugNode } from '../debugger/breakpoint_handler'; +import { fileExists } from '../utils/utils'; class Message { timeStamp: Date; @@ -185,6 +186,22 @@ export class SdfgViewerProvider ): Promise { let node: any; switch (message.type) { + case 'disable_minimap': + vscode.workspace.getConfiguration('dace.sdfv')?.update( + 'minimap', false + ).then(() => { + vscode.window.showInformationMessage( + 'Minimap disabled, you can re-enable the feature in ' + + 'your settings.' + ); + }); + break; + case 'set_split_direction': + if (message.direction) + vscode.workspace.getConfiguration('dace.sdfv')?.update( + 'layout', message.direction + ); + break; case 'get_current_sdfg': const instance = SdfgViewerProvider.getInstance(); if (instance !== undefined && origin !== undefined) { @@ -199,55 +216,81 @@ export class SdfgViewerProvider } break; case 'go_to_source': - // We want to jump to a specific file and location if it - // exists. - // TODO: remove deprecated root path method. - let filePath: string; - if (path.isAbsolute(message.filePath)) - filePath = message.filePath; - else - filePath = path.normalize( - vscode.workspace.rootPath + '/' + message.filePath + // We want to jump to a specific file and location if it exists. + let filePath: vscode.Uri | null = null; + if (path.isAbsolute(message.filePath)) { + filePath = vscode.Uri.file(message.filePath); + } else if (vscode.workspace.workspaceFolders) { + // If the provided path is relative, search through the open + // workspace folders to see if one contains a file at the + // provided relative path. + for (const wsFolder of vscode.workspace.workspaceFolders) { + const filePathCandidate = vscode.Uri.joinPath( + wsFolder.uri, message.filePath + ); + if (await fileExists(filePathCandidate)) { + filePath = filePathCandidate; + break; + } + } + } else { + vscode.window.showErrorMessage( + 'Cannot jump to the relative path ' + message.filePath + + 'without a folder open in VSCode.' ); + return; + } - const fileUri: vscode.Uri = vscode.Uri.file(filePath); - this.goToFileLocation( - fileUri, - message.startRow, - message.startChar, - message.endRow, - message.endChar - ); + if (filePath) + this.goToFileLocation( + filePath, + message.startRow, + message.startChar, + message.endRow, + message.endChar + ); break; case 'go_to_cpp': - // If the message passes a cache path then use that path, otherwise - // get the cache directory of the currently opened SDFG - let cachePath: string = message.cachePath; - if (!cachePath) { - const SdfgFileName = DaCeVSCode.getInstance() - .getActiveSdfgFileName(); - if (!SdfgFileName) - return; - - const sdfgFilePath = vscode.Uri.file(SdfgFileName).fsPath; - cachePath = path.dirname(sdfgFilePath); + // If the message passes a cache path then use that path, + // otherwise reconstruct the folder based on the default cache + // directory with respect to the opened workspace folder and the + // SDFG name. + let cacheUri: vscode.Uri | null = null; + const cPath: string = message.cachePath ?? path.join( + '.', '.dacecache', message.sdfgName + ); + if (path.isAbsolute(cPath)) { + cacheUri = vscode.Uri.file(message.cachePath); + } else if (vscode.workspace.workspaceFolders) { + // If the provided path is relative, search through the open + // workspace folders to see if one contains a file at the + // provided relative path. + for (const wsFolder of vscode.workspace.workspaceFolders) { + const cacheUriCandidate = vscode.Uri.joinPath( + wsFolder.uri, cPath + ); + if (await fileExists(cacheUriCandidate)) { + cacheUri = cacheUriCandidate; + break; + } + } + } else { + vscode.window.showErrorMessage( + 'Cannot jump to the relative path ' + cPath + + 'without a folder open in VSCode.' + ); + return; } - let mapPath = path.join( - cachePath, - 'map', - 'map_cpp.json' - ); + if (!cacheUri) + return; - let cppPath = path.join( - cachePath, - 'src', - 'cpu', - message.sdfgName + '.cpp' + const cppMapUri = vscode.Uri.joinPath( + cacheUri, 'map', 'map_cpp.json' + ); + const cppFileUri = vscode.Uri.joinPath( + cacheUri, 'src', 'cpu', message.sdfgName + '.cpp' ); - - const cppMapUri = vscode.Uri.file(mapPath); - const cppFileUri = vscode.Uri.file(cppPath); node = new SDFGDebugNode( message.sdfgId, message.stateId, @@ -324,13 +367,13 @@ export class SdfgViewerProvider endLine: number, endCol: number ): void { - /* Load the file and show it in a new editor, highlighting the - indicated range. */ + // Load the file and show it in a new editor, highlighting the + // indicated range. vscode.workspace.openTextDocument(fileUri).then( (doc: vscode.TextDocument) => { const startPos = new vscode.Position( - startLine, startCol + startLine - 1, startCol ); const endPos = new vscode.Position( endLine, endCol @@ -354,7 +397,7 @@ export class SdfgViewerProvider public openViewer(uri: vscode.Uri, messages: Message[] = []): void { // If the SDFG is currently open, then execute the messages - // otherwise store them to execute as soon as the SDFG is loaded + // otherwise store them to execute as soon as the SDFG is loaded. let editorIsLoaded = false; for (const editor of this.getOpenEditors()) { if (editor.document.uri.fsPath === uri.fsPath) { @@ -362,18 +405,18 @@ export class SdfgViewerProvider break; } } + if (!editorIsLoaded) { - // The SDFG isn't yet loaded so we store the msgs - // to execute after the SDFG is loaded (calls - // 'process_queued_messages') + // The SDFG isn't yet loaded so we store the messages to execute + // after the SDFG is loaded (calls `process_queued_messages`). for (const msg of messages) this.messages.push(msg); vscode.commands.executeCommand( 'vscode.openWith', uri, SdfgViewerProvider.viewType ); } else { - // The SDFG is already loaded so we can just jump to it - // and send the messages + // The SDFG is already loaded so we can just jump to it and send the + // messages. vscode.commands.executeCommand( 'vscode.openWith', uri, SdfgViewerProvider.viewType ).then(_ => { @@ -508,10 +551,18 @@ export class SdfgViewerProvider // the info container to the right instead of at the bottom. Also hide // the minimap if the settings say so. const sdfvConfig = vscode.workspace.getConfiguration('dace.sdfv'); - if (sdfvConfig?.get('layout') === 'vertical') { + if (sdfvConfig?.get('layout') === 'horizontal') { + baseHtml = baseHtml.replace( + 'offcanvas offcanvas-end', + 'offcanvas offcanvas-bottom' + ); + baseHtml = baseHtml.replace( + 'id="layout-toggle-btn" class="vertical"', + 'id="layout-toggle-btn" class="horizontal"' + ); baseHtml = baseHtml.replace( - '
', - '
' + 'gutter-vertical', + 'gutter-horizontal' ); baseHtml = baseHtml.replace( 'SPLIT_DIRECTION = \'vertical\';', diff --git a/src/dace_interface.ts b/src/dace_interface.ts index 9fd7095..f98cc44 100644 --- a/src/dace_interface.ts +++ b/src/dace_interface.ts @@ -17,6 +17,7 @@ import { import { TransformationListProvider } from './components/transformation_list'; import { DaCeVSCode } from './extension'; import { showUntrustedWorkspaceWarning, walkDirectory } from './utils/utils'; +import { JsonTransformation } from './webclients/components/transformations/transformations'; enum InteractionMode { PREVIEW, @@ -43,9 +44,9 @@ export class DaCeInterface case 'expand_library_node': this.expandLibraryNode(message.nodeId); break; - case 'apply_transformation': - if (message.transformation !== undefined) - this.applyTransformation(message.transformation); + case 'apply_transformations': + if (message.transformations !== undefined) + this.applyTransformations(message.transformations); break; case 'preview_transformation': if (message.transformation !== undefined) @@ -515,17 +516,55 @@ export class DaCeInterface !OptimizationPanel.getInstance().isVisible()) return; + const handleDaemonConnected = () => { + SdfgViewerProvider.getInstance()?.handleMessage({ + type: 'daemon_connected', + }); + TransformationHistoryProvider.getInstance()?.refresh(); + TransformationListProvider.getInstance()?.refresh(true); + this.querySdfgMetadata(); + }; + + const onBooted = async () => { + const customXformPaths = vscode.workspace.getConfiguration( + 'dace.optimization' + )?.get('customTransformationsPaths'); + if (customXformPaths) { + const paths = []; + for (const path of customXformPaths) { + try { + const u = vscode.Uri.file(path); + const stat = await vscode.workspace.fs.stat(u); + if (stat.type === vscode.FileType.Directory) { + for await (const fileUri of walkDirectory(u, '.py')) + paths.push(fileUri.fsPath); + } else if (stat.type === vscode.FileType.File) { + paths.push(u.fsPath); + } + } catch { + vscode.window.showErrorMessage( + 'Failed to load custom transformations from ' + + 'path "' + path + '" configured in your settings.' + ); + } + } + + this.sendPostRequest( + '/add_transformations', + { + paths: paths, + }, + handleDaemonConnected + ); + } else { + handleDaemonConnected(); + } + }; + const callBoot = () => { this.daemonBooting = true; - this.startDaemonInTerminal(() => { - SdfgViewerProvider.getInstance()?.handleMessage({ - type: 'daemon_connected', - }); - TransformationHistoryProvider.getInstance()?.refresh(); - TransformationListProvider.getInstance()?.refresh(true); - this.querySdfgMetadata(); - }); + this.startDaemonInTerminal(onBooted); }; if (vscode.workspace.isTrusted) { @@ -568,25 +607,30 @@ export class DaCeInterface }); } - private sendApplyTransformationRequest(transformation: any, - callback: CallableFunction, - processingMessage?: string) { + private sendApplyTransformationRequest( + transformations: JsonTransformation[], callback: CallableFunction, + processingMessage?: string + ) { if (!this.daemonRunning) { this.promptStartDaemon(); return; } this.showSpinner( - processingMessage ? processingMessage : 'Applying Transformation' + processingMessage ? processingMessage : ( + 'Applying Transformation' + ( + transformations.length > 1 ? 's' : '' + ) + ) ); DaCeVSCode.getInstance().getActiveSdfg().then((sdfg) => { if (sdfg) { this.sendPostRequest( - '/apply_transformation', + '/apply_transformations', { sdfg: sdfg, - transformation: transformation, + transformations: transformations, permissive: false, }, callback @@ -619,8 +663,8 @@ export class DaCeInterface }); } - public applyTransformation(transformation: any): void { - this.sendApplyTransformationRequest(transformation, (data: any) => { + public applyTransformations(transformations: JsonTransformation[]): void { + this.sendApplyTransformationRequest(transformations, (data: any) => { this.hideSpinner(); this.writeToActiveDocument(data.sdfg); }); @@ -628,7 +672,7 @@ export class DaCeInterface public previewTransformation(transformation: any): void { this.sendApplyTransformationRequest( - transformation, + [transformation], (data: any) => { this.previewSdfg(data.sdfg); this.hideSpinner(); diff --git a/src/extension.ts b/src/extension.ts index b81f8ba..eaa6936 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -296,8 +296,8 @@ export class DaCeVSCode { type: 'refresh_sdfg', }); }); - this.registerCommand('sdfg.applyTransformation', - (t) => DaCeInterface.getInstance().applyTransformation(t)); + this.registerCommand('sdfg.applyTransformations', + (t) => DaCeInterface.getInstance().applyTransformations(t)); this.registerCommand('sdfg.previewTransformation', (t) => DaCeInterface.getInstance().previewTransformation(t)); this.registerCommand('sdfg.previewHistoryPoint', diff --git a/src/utils/sdfg_meta_dict.json b/src/utils/sdfg_meta_dict.json index 6daebc8..336e780 100644 --- a/src/utils/sdfg_meta_dict.json +++ b/src/utils/sdfg_meta_dict.json @@ -226,6 +226,7 @@ "No_Instrumentation", "Timer", "PAPI_Counters", + "LIKWID_Counters", "GPU_Events", "FPGA" ] @@ -384,6 +385,7 @@ "BatchedMatMul": "dace.libraries.blas.nodes.batched_matmul.BatchedMatMul", "Transpose": "dace.libraries.blas.nodes.transpose.Transpose", "Axpy": "dace.libraries.blas.nodes.axpy.Axpy", + "Einsum": "dace.libraries.blas.nodes.einsum.Einsum", "CodeLibraryNode": "dace.libraries.standard.nodes.code.CodeLibraryNode", "Gearbox": "dace.libraries.standard.nodes.gearbox.Gearbox", "Reduce": "dace.libraries.standard.nodes.reduce.Reduce" @@ -744,6 +746,18 @@ "category": "General", "default": 0 }, + "optional": { + "metatype": "bool", + "desc": "Specifies whether this array may have a value of None. If False, the array must not be None. If option is not set, it is inferred by other properties and the OptionalArrayInference pass.", + "category": "General", + "default": null + }, + "pool": { + "metatype": "bool", + "desc": "Hint to the allocator that using a memory pool is preferred", + "category": "General", + "default": false + }, "dtype": { "metatype": "typeclass", "desc": "", @@ -1099,6 +1113,18 @@ "category": "General", "default": 0 }, + "optional": { + "metatype": "bool", + "desc": "Specifies whether this array may have a value of None. If False, the array must not be None. If option is not set, it is inferred by other properties and the OptionalArrayInference pass.", + "category": "General", + "default": null + }, + "pool": { + "metatype": "bool", + "desc": "Hint to the allocator that using a memory pool is preferred", + "category": "General", + "default": false + }, "dtype": { "metatype": "typeclass", "desc": "", @@ -1291,6 +1317,18 @@ "category": "General", "default": 0 }, + "optional": { + "metatype": "bool", + "desc": "Specifies whether this array may have a value of None. If False, the array must not be None. If option is not set, it is inferred by other properties and the OptionalArrayInference pass.", + "category": "General", + "default": null + }, + "pool": { + "metatype": "bool", + "desc": "Hint to the allocator that using a memory pool is preferred", + "category": "General", + "default": false + }, "dtype": { "metatype": "typeclass", "desc": "", @@ -1679,6 +1717,7 @@ "No_Instrumentation", "Timer", "PAPI_Counters", + "LIKWID_Counters", "GPU_Events", "FPGA" ] @@ -1800,6 +1839,7 @@ "No_Instrumentation", "Timer", "PAPI_Counters", + "LIKWID_Counters", "GPU_Events", "FPGA" ] @@ -1912,6 +1952,7 @@ "No_Instrumentation", "Timer", "PAPI_Counters", + "LIKWID_Counters", "GPU_Events", "FPGA" ] @@ -2059,6 +2100,7 @@ "No_Instrumentation", "Timer", "PAPI_Counters", + "LIKWID_Counters", "GPU_Events", "FPGA" ] @@ -2090,6 +2132,14 @@ "default": 0, "indirected": true }, + "gpu_block_size": { + "metatype": "list", + "desc": "GPU kernel block size", + "category": "General", + "default": null, + "indirected": true, + "element_type": "int" + }, "in_connectors": { "metatype": "dict", "desc": "A set of input connectors for this node.", @@ -2210,6 +2260,7 @@ "No_Instrumentation", "Timer", "PAPI_Counters", + "LIKWID_Counters", "GPU_Events", "FPGA" ] @@ -2237,6 +2288,13 @@ "desc": "OpenMP schedule chunk size", "category": "General", "default": 0 + }, + "gpu_block_size": { + "metatype": "list", + "desc": "GPU kernel block size", + "category": "General", + "default": null, + "element_type": "int" } }, "ConsumeEntry": { @@ -2329,6 +2387,7 @@ "No_Instrumentation", "Timer", "PAPI_Counters", + "LIKWID_Counters", "GPU_Events", "FPGA" ] @@ -2449,6 +2508,7 @@ "No_Instrumentation", "Timer", "PAPI_Counters", + "LIKWID_Counters", "GPU_Events", "FPGA" ] @@ -2583,6 +2643,7 @@ "No_Instrumentation", "Timer", "PAPI_Counters", + "LIKWID_Counters", "GPU_Events", "FPGA" ] @@ -2614,6 +2675,14 @@ "default": 0, "indirected": true }, + "gpu_block_size": { + "metatype": "list", + "desc": "GPU kernel block size", + "category": "General", + "default": null, + "indirected": true, + "element_type": "int" + }, "in_connectors": { "metatype": "dict", "desc": "A set of input connectors for this node.", @@ -2764,6 +2833,7 @@ "No_Instrumentation", "Timer", "PAPI_Counters", + "LIKWID_Counters", "GPU_Events", "FPGA" ] @@ -2791,6 +2861,13 @@ "desc": "OpenMP schedule chunk size", "category": "General", "default": 0 + }, + "gpu_block_size": { + "metatype": "list", + "desc": "GPU kernel block size", + "category": "General", + "default": null, + "element_type": "int" } }, "LibraryNode": { @@ -2900,6 +2977,7 @@ "No_Instrumentation", "Timer", "PAPI_Counters", + "LIKWID_Counters", "GPU_Events", "FPGA" ] @@ -3192,6 +3270,7 @@ "No_Instrumentation", "Timer", "PAPI_Counters", + "LIKWID_Counters", "GPU_Events", "FPGA" ] @@ -3452,6 +3531,18 @@ } }, "dace.libraries.blas.nodes.matmul.MatMul": { + "alpha": { + "metatype": "Property", + "desc": "A scalar which will be multiplied with A @ B before adding C", + "category": "General", + "default": 1 + }, + "beta": { + "metatype": "Property", + "desc": "A scalar which will be multiplied with C before adding C", + "category": "General", + "default": 0 + }, "name": { "metatype": "str", "desc": "Name of node", @@ -5421,6 +5512,140 @@ "value_type": "typeclass" } }, + "dace.libraries.blas.nodes.einsum.Einsum": { + "einsum_str": { + "metatype": "str", + "desc": "The Einstein notation string that describes this einsum", + "category": "General", + "default": "" + }, + "alpha": { + "metatype": "SymbolicProperty", + "desc": "The coefficient to multiply the inputs with", + "category": "General", + "default": 1.0 + }, + "beta": { + "metatype": "SymbolicProperty", + "desc": "The coefficient to multiply the output with when added to the product", + "category": "General", + "default": 0.0 + }, + "name": { + "metatype": "str", + "desc": "Name of node", + "category": "General", + "default": "" + }, + "implementation": { + "metatype": "LibraryImplementationProperty", + "desc": "Which implementation this library node will expand into.Must match a key in the list of possible implementations.", + "category": "General", + "default": null, + "choices": [ + "specialize" + ] + }, + "schedule": { + "metatype": "ScheduleType", + "desc": "If set, determines the default device mapping of the node upon expansion, if expanded to a nested SDFG.", + "category": "General", + "default": "Default", + "choices": [ + "Default", + "Sequential", + "MPI", + "CPU_Multicore", + "Unrolled", + "SVE_Map", + "GPU_Default", + "GPU_Device", + "GPU_ThreadBlock", + "GPU_ThreadBlock_Dynamic", + "GPU_Persistent", + "FPGA_Device", + "Snitch", + "Snitch_Multicore" + ] + }, + "debuginfo": { + "metatype": "DebugInfo", + "desc": "", + "category": "General", + "default": { + "type": "DebugInfo", + "start_line": 0, + "end_line": 0, + "start_column": 0, + "end_column": 0, + "filename": null + } + }, + "label": { + "metatype": "str", + "desc": "Name of the CodeNode", + "category": "General", + "default": "" + }, + "location": { + "metatype": "dict", + "desc": "Full storage location identifier (e.g., rank, GPU ID)", + "category": "General", + "default": {}, + "key_type": "str", + "value_type": "pystr_to_symbolic" + }, + "environments": { + "metatype": "set", + "desc": "Environments required by CMake to build and run this code node.", + "category": "General", + "default": [] + }, + "in_connectors": { + "metatype": "dict", + "desc": "A set of input connectors for this node.", + "category": "General", + "default": {}, + "key_type": "str", + "value_type": "typeclass" + }, + "out_connectors": { + "metatype": "dict", + "desc": "A set of output connectors for this node.", + "category": "General", + "default": {}, + "key_type": "str", + "value_type": "typeclass" + } + }, + "SpecializeEinsum": { + "sdfg_id": { + "metatype": "int", + "desc": "", + "category": "(Debug)", + "default": 0 + }, + "state_id": { + "metatype": "int", + "desc": "", + "category": "(Debug)", + "default": 0 + }, + "_subgraph": { + "metatype": "dict", + "desc": "", + "category": "(Debug)", + "default": {}, + "key_type": "int", + "value_type": "int" + }, + "expr_index": { + "metatype": "int", + "desc": "", + "category": "(Debug)", + "default": 0 + } + }, "dace.libraries.standard.nodes.code.CodeLibraryNode": { "inputdict": { "metatype": "dict", diff --git a/src/utils/utils.ts b/src/utils/utils.ts index 68636fd..6be86f3 100644 --- a/src/utils/utils.ts +++ b/src/utils/utils.ts @@ -3,6 +3,15 @@ import * as vscode from 'vscode'; +export async function fileExists(uri: vscode.Uri): Promise { + try { + await vscode.workspace.fs.stat(uri); + return true; + } catch { + return false; + } +} + export async function* walkDirectory( dir: vscode.Uri, filter?: string ): AsyncGenerator { diff --git a/src/webclients/components/sdfv/messaging/message_handler.ts b/src/webclients/components/sdfv/messaging/message_handler.ts index 3d5b8cd..e79393e 100644 --- a/src/webclients/components/sdfv/messaging/message_handler.ts +++ b/src/webclients/components/sdfv/messaging/message_handler.ts @@ -17,7 +17,7 @@ import { } from '../breakpoints/breakpoints'; import { VSCodeRenderer } from '../renderer/vscode_renderer'; import { - applyTransformation, + applyTransformations, clearSelectedTransformation, getApplicableTransformations, refreshTransformationList, @@ -42,9 +42,9 @@ export class MessageHandler { const renderer = VSCodeRenderer.getInstance(); const sdfv = VSCodeSDFV.getInstance(); switch (message.type) { - case 'apply_transformation': - if (message.transformation) - applyTransformation(message.transformation); + case 'apply_transformations': + if (message.transformations) + applyTransformations(...message.transformations); break; case 'load_instrumentation_report': renderer?.get_overlay_manager().deregister_overlay( diff --git a/src/webclients/components/sdfv/properties/properties.ts b/src/webclients/components/sdfv/properties/properties.ts index a4f8638..31aa6d3 100644 --- a/src/webclients/components/sdfv/properties/properties.ts +++ b/src/webclients/components/sdfv/properties/properties.ts @@ -21,8 +21,12 @@ type RangeInput = { step: JQuery, }; +// Note that this Property class is not an equivalent to SDFG Properties, but +// a more general attribute of SDFG elements in VSCode. export abstract class Property { + private _deleted: boolean = false; + constructor ( protected element: any | undefined, protected xform: any | undefined, @@ -33,6 +37,14 @@ export abstract class Property { ) { } + public markDeleted(): void { + this._deleted = true; + } + + public get deleted(): boolean { + return this._deleted; + } + protected writeBack(value: any): void { if (this.subkey !== undefined) { if (this.datatype === 'Range' || @@ -90,6 +102,8 @@ export class KeyProperty { * subclass of Property. */ + private _deleted: boolean = false; + constructor( protected element: any | undefined, protected xform: any | undefined, @@ -99,6 +113,14 @@ export class KeyProperty { ) { } + public markDeleted(): void { + this._deleted = true; + } + + public get deleted(): boolean { + return this._deleted; + } + public getValue(): { value: any, valueChanged: boolean } { const newKey = this.input.val(); return { @@ -379,19 +401,23 @@ export class TypeclassProperty extends ComboboxProperty { const descriptor = compoundFields[key]; const type = descriptor['type']; - const meta = VSCodeSDFV.getInstance().getMetaDict(); - let valMeta = undefined; - if (type in meta['__reverse_type_lookup__']) - valMeta = meta['__reverse_type_lookup__'][type]; - - const attrProp = attributeTablePutEntry( - key, this.compoundValues[key], - valMeta, this.compoundValues, undefined, undefined, - rowbox, false, false, false - ); - - if (attrProp) - this.compoundProp?.getProperties().push(attrProp); + const val = this.compoundValues[key]; + VSCodeSDFV.getInstance().getMetaDict().then(meta => { + let valMeta = undefined; + if (type in meta['__reverse_type_lookup__']) + valMeta = meta['__reverse_type_lookup__'][type]; + + const row = $('
', { + class: 'row attr-table-row', + }).appendTo(rowbox); + attributeTablePutEntry( + key, val, valMeta, this.compoundValues, undefined, + undefined, row, false, false, false + ).then(attrProp => { + if (attrProp) + this.compoundProp?.getProperties().push(attrProp); + }); + }); } // When the confirm button is clicked, transfer the new values from the @@ -462,10 +488,12 @@ export class ListProperty extends Property { const newList = []; for (let i = 0; i < this.propertiesList.length; i++) { - const res = this.propertiesList[i].getValue(); - if (res !== undefined && res.value !== undefined && - res.value !== '') - newList.push(res.value); + if (!this.propertiesList[i].deleted) { + const res = this.propertiesList[i].getValue(); + if (res !== undefined && res.value !== undefined && + res.value !== '') + newList.push(res.value); + } } return { value: newList, @@ -525,27 +553,29 @@ export class DictProperty extends Property { let valueChanged = false; this.properties.forEach(prop => { if ((prop.keyProp || prop.key) && prop.valProp) { - const keyRes = prop.keyProp?.getValue(); - let keyVal = keyRes?.value; - if (!keyVal || keyVal === '') - keyVal = prop.key; - if (keyVal !== undefined && keyVal !== '') { - prop.valProp.forEach(vp => { - const valRes = vp.getValue(); - const valSubkey = vp.getSubkey(); - if (vp.getDatatype() === 'CodeBlock' && - valSubkey !== undefined) { - // For code properties, we need to write back the - // entire code property structure, including - // language info. - let codeVal = vp.getTarget()[vp.getKey()]; - codeVal[valSubkey] = valRes.value; - newDict[keyVal] = codeVal; - } else { - newDict[keyVal] = valRes.value; - } - }); - valueChanged = true; + if (prop.keyProp && !prop.keyProp.deleted) { + const keyRes = prop.keyProp.getValue(); + let keyVal = keyRes?.value; + if (!keyVal || keyVal === '') + keyVal = prop.key; + if (keyVal !== undefined && keyVal !== '') { + prop.valProp.forEach(vp => { + const valRes = vp.getValue(); + const valSubkey = vp.getSubkey(); + if (vp.getDatatype() === 'CodeBlock' && + valSubkey !== undefined) { + // For code properties, we need to write back + // the entire code property structure, including + // language info. + let codeVal = vp.getTarget()[vp.getKey()]; + codeVal[valSubkey] = valRes.value; + newDict[keyVal] = codeVal; + } else { + newDict[keyVal] = valRes.value; + } + }); + valueChanged = true; + } } } }); diff --git a/src/webclients/components/sdfv/renderer/vscode_renderer.ts b/src/webclients/components/sdfv/renderer/vscode_renderer.ts index 043bc99..6e2d701 100644 --- a/src/webclients/components/sdfv/renderer/vscode_renderer.ts +++ b/src/webclients/components/sdfv/renderer/vscode_renderer.ts @@ -28,6 +28,7 @@ import { } from '../vscode_sdfv'; declare const vscode: any; +declare let MINIMAP_ENABLED: boolean; export class VSCodeRenderer extends SDFGRenderer { @@ -121,13 +122,28 @@ export class VSCodeRenderer extends SDFGRenderer { sdfv, sdfg, container, onMouseEvent, userTransform, debugDraw, backgroundColor, modeButtons ); + + if (this.minimap_canvas) { + const disableMinimapButton = $('
', { + id: 'minimap-close-button', + title: 'Disable Minimap', + html: 'cancel', + click: () => { + MINIMAP_ENABLED = false; + this.minimap_canvas?.remove(); + this.minimap_ctx = null; + this.minimap_canvas = null; + disableMinimapButton.remove(); + vscode.postMessage({ + type: 'sdfv.disable_minimap', + }); + }, + }).appendTo($(this.container)); + } } public async localViewSelection(): Promise { await super.localViewSelection(); - // Hide the info button so the local view controls cannot be disabled - // by accident. - $('#info-clear-btn').hide(); } public exitLocalView(): void { @@ -138,12 +154,13 @@ export class VSCodeRenderer extends SDFGRenderer { vscodeWriteGraph(this.sdfg); } - public addNodeToGraph( + public async addNodeToGraph( addType: SDFGElementType, parentUUID: string, lib: string | null = null, edgeStartUUID: string | null = null, edgeStartConn: string | null = null, edgeDstConn: string | null = null - ): void { - const meta = VSCodeSDFV.getInstance().getMetaDict()[addType]; + ): Promise { + const metaDict = await VSCodeSDFV.getInstance().getMetaDict(); + const meta = metaDict[addType]; const rootSdfg = VSCodeRenderer.getInstance()?.get_sdfg(); if (!rootSdfg) @@ -171,10 +188,7 @@ export class VSCodeRenderer extends SDFGRenderer { } }, }; - const iseMeta = - VSCodeSDFV.getInstance().getMetaDict()[ - 'InterstateEdge' - ]; + const iseMeta = metaDict['InterstateEdge']; for (const key in iseMeta) { const attrs: any = element.attributes.data.attributes; @@ -205,8 +219,7 @@ export class VSCodeRenderer extends SDFGRenderer { } }, }; - const mceMeta = - VSCodeSDFV.getInstance().getMetaDict()['Memlet']; + const mceMeta = metaDict['Memlet']; for (const key in mceMeta) { const attrs: any = element.attributes.data.attributes; @@ -280,10 +293,9 @@ export class VSCodeRenderer extends SDFGRenderer { attributes: {}, type: SDFGElementType.SDFGState }; - const stateMeta = - VSCodeSDFV.getInstance().getMetaDict()[ - SDFGElementType.SDFGState - ]; + const stateMeta = metaDict[ + SDFGElementType.SDFGState + ]; for (const key in stateMeta) { if (nSdfgState.attributes[key] === undefined) { const val = stateMeta[key]; @@ -301,8 +313,7 @@ export class VSCodeRenderer extends SDFGRenderer { error: undefined, sdfg_list_id: maxSdfgId + 1, }; - const sdfgMeta = - VSCodeSDFV.getInstance().getMetaDict()['SDFG']; + const sdfgMeta = metaDict['SDFG']; for (const key in sdfgMeta) { if (nSdfg.attributes[key] === undefined) { const val = sdfgMeta[key]; @@ -326,10 +337,9 @@ export class VSCodeRenderer extends SDFGRenderer { scope_entry: element.id, scope_exit: element.id + 1, }; - const exitMeta = - VSCodeSDFV.getInstance().getMetaDict()[ - 'MapExit' - ]; + const exitMeta = metaDict[ + SDFGElementType.MapExit + ]; for (const key in exitMeta) { if (exitElem.attributes[key] === undefined) { const val = exitMeta[key]; @@ -351,10 +361,9 @@ export class VSCodeRenderer extends SDFGRenderer { scope_entry: element.id, scope_exit: element.id + 1, }; - const exitMeta = - VSCodeSDFV.getInstance().getMetaDict()[ - 'ConsumeExit' - ]; + const exitMeta = metaDict[ + SDFGElementType.ConsumeExit + ]; for (const key in exitMeta) { if (exitElem.attributes[key] === undefined) { const val = exitMeta[key]; @@ -503,68 +512,68 @@ export class VSCodeRenderer extends SDFGRenderer { } public showSelectLibraryNodeDialog(callback: CallableFunction): void { - const sdfgMetaDict = VSCodeSDFV.getInstance().getMetaDict(); - - const modalRet = createSingleUseModal( - 'Select Library Node', true, '' - ); - - const libraries = sdfgMetaDict['__libs__']; - - const container = $('
', { - 'class': 'container-fluid', - }).appendTo(modalRet.body); - - const row = $('
', { - 'class': 'row', - }).appendTo(container); - - const headerWrapper = $('
', { - 'class': 'col-3', - }).appendTo(row); - $('', { - 'text': 'Library:' - }).appendTo(headerWrapper); - - const libInputWrapper = $('
', { - 'class': 'col-9', - }).appendTo(row); - const libInput = $('', { + 'id': 'lib-selection-input-list', + 'class': 'sdfv-property-dropdown', + 'style': 'width: 100%;', + 'placeholder': 'Type to search...' + }).appendTo(libInputWrapper); + + Object.keys(libraries).forEach(libname => { + libInput.append(new Option( + libname, + libraries[libname], + false, + false + )); + }); + + libInput.editableSelect({ + filter: false, + effects: 'fade', + duration: 'fast', + }); + + const backgroundLibInput = $('#lib-selection-input-list'); + + modalRet.confirmBtn?.on('click', () => { + const libInputVal = backgroundLibInput.val(); + if (libInputVal && typeof libInputVal === 'string') { + callback(); + this.add_mode_lib = libraries[libInputVal]; + modalRet.modal.modal('hide'); + } else { + backgroundLibInput.addClass('is-invalid'); + } + }); - modalRet.confirmBtn?.on('click', () => { - const libInputVal = backgroundLibInput.val(); - if (libInputVal && typeof libInputVal === 'string') { - callback(); - this.add_mode_lib = libraries[libInputVal]; - modalRet.modal.modal('hide'); - } else { - backgroundLibInput.addClass('is-invalid'); - } + modalRet.modal.modal('show'); }); - - modalRet.modal.modal('show'); } public clearSelectedItems(): void { diff --git a/src/webclients/components/sdfv/transformation/transformation.ts b/src/webclients/components/sdfv/transformation/transformation.ts index 8a10e23..9b1e615 100644 --- a/src/webclients/components/sdfv/transformation/transformation.ts +++ b/src/webclients/components/sdfv/transformation/transformation.ts @@ -195,7 +195,7 @@ export async function sortTransformations( ]; for (const xformList of xformLists) { - xformList.sort((a, b) => { + xformList.sort((a: any, b: any) => { const sgXformType = 'SubgraphTransformation'; const aName = a.transformation; @@ -247,7 +247,7 @@ export function refreshTransformationList(hideLoading: boolean = false): void { export function clearSelectedTransformation(): void { if (VSCodeSDFV.getInstance().getSelectedTransformation() !== null) - VSCodeSDFV.getInstance().clearInfoBox(); + VSCodeSDFV.getInstance().clearInfoBox(true); } /** @@ -261,30 +261,30 @@ export function showTransformationDetails(xform: any): void { $('#goto-source-btn').hide(); $('#goto-cpp-btn').hide(); - $('#info-title').text(xform.transformation); + VSCodeSDFV.getInstance().infoBoxSetTitle(xform.transformation); const infoContents = $('#info-contents'); infoContents.html(''); const xformButtonContainer = $('
', { - 'class': 'transformation-button-container', + class: 'transformation-button-container', }).appendTo(infoContents); const xformInfoContainer = $('
', { - 'class': 'transformation-info-container', + class: 'transformation-info-container', }).appendTo(infoContents); //let doc_lines = trafo.docstring.split('\n'); // TODO: Docstring's formatting goes down the gutter // this way. Find a way to pretty print it. $('

', { - 'class': 'transformation-description-text', - 'text': xform.docstring, + class: 'transformation-description-text', + text: xform.docstring, }).appendTo(xformInfoContainer); const xformImage = $('', { - 'class': 'transformation-image', - 'type': 'image/gif', + class: 'transformation-image', + type: 'image/gif', }).appendTo(xformInfoContainer); xformImage.attr( 'data', @@ -292,15 +292,18 @@ export function showTransformationDetails(xform: any): void { xform.transformation + '.gif' ); + const affectedIds = transformationGetAffectedUUIDs(xform); + zoomToUUIDs(affectedIds); + $('
', { - 'class': 'button', - 'click': () => { - zoomToUUIDs(transformationGetAffectedUUIDs(xform)); + class: 'button', + click: () => { + zoomToUUIDs(affectedIds); }, - 'mouseenter': () => { - highlightUUIDs(transformationGetAffectedUUIDs(xform)); + mouseenter: () => { + highlightUUIDs(affectedIds); }, - 'mouseleave': () => { + mouseleave: () => { VSCodeRenderer.getInstance()?.draw_async(); }, }).append($('', { @@ -308,18 +311,18 @@ export function showTransformationDetails(xform: any): void { })).appendTo(xformButtonContainer); $('
', { - 'class': 'button', - 'click': () => { + class: 'button', + click: () => { if (vscode) vscode.postMessage({ type: 'dace.preview_transformation', transformation: xform, }); }, - 'mouseenter': () => { - highlightUUIDs(transformationGetAffectedUUIDs(xform)); + mouseenter: () => { + highlightUUIDs(affectedIds); }, - 'mouseleave': () => { + mouseleave: () => { VSCodeRenderer.getInstance()?.draw_async(); }, }).append($('', { @@ -327,14 +330,14 @@ export function showTransformationDetails(xform: any): void { })).appendTo(xformButtonContainer); $('
', { - 'class': 'button', - 'click': () => { - applyTransformation(xform); + class: 'button', + click: () => { + applyTransformations(xform); }, - 'mouseenter': () => { - highlightUUIDs(transformationGetAffectedUUIDs(xform)); + mouseenter: () => { + highlightUUIDs(affectedIds); }, - 'mouseleave': () => { + mouseleave: () => { VSCodeRenderer.getInstance()?.draw_async(); }, }).append($('', { @@ -353,21 +356,24 @@ export function showTransformationDetails(xform: any): void { text: 'Export To File', })).appendTo(xformButtonContainer); - generateAttributesTable(undefined, xform, infoContents); + const tableContainer = $('
', { + 'class': 'container-fluid attr-table-base-container', + }).appendTo(infoContents); + generateAttributesTable(undefined, xform, tableContainer); - $('#info-clear-btn').show(); + VSCodeSDFV.getInstance().infoBoxShow(true); } -export function applyTransformation(xform: any): void { +export function applyTransformations(...xforms: JsonTransformation[]): void { if (vscode) { VSCodeRenderer.getInstance()?.clearSelectedItems(); - VSCodeSDFV.getInstance().clearInfoBox(); + VSCodeSDFV.getInstance().clearInfoBox(true); const el = document.getElementById('exit-preview-button'); if (el) el.className = 'button hidden'; vscode.postMessage({ - type: 'dace.apply_transformation', - transformation: xform, + type: 'dace.apply_transformations', + transformations: xforms, }); } } diff --git a/src/webclients/components/sdfv/utils/attributes_table.ts b/src/webclients/components/sdfv/utils/attributes_table.ts index f40c01e..33f4e1d 100644 --- a/src/webclients/components/sdfv/utils/attributes_table.ts +++ b/src/webclients/components/sdfv/utils/attributes_table.ts @@ -32,7 +32,6 @@ import { VSCodeSDFV } from '../vscode_sdfv'; import { createSingleUseModal, doForAllNodeTypes, - elementUpdateLabel, getElementMetadata, getTransformationMetadata, vscodeWriteGraph @@ -90,8 +89,6 @@ export function attrTablePutCode( key: string, subkey: string | undefined, val: string, elem: any | undefined, xform: any | undefined, target: any, cell: JQuery, dtype: string ): CodeProperty { - const sdfgMetaDict = VSCodeSDFV.getInstance().getMetaDict(); - let lang = 'Python'; if (target[key]) lang = target[key]['language']; @@ -104,19 +101,20 @@ export function attrTablePutCode( 'class': 'sdfv-property-monaco', }).appendTo(container); - const languages: string[] = sdfgMetaDict ? sdfgMetaDict[ - '__reverse_type_lookup__' - ]['Language'].choices : []; const languageInput = $('', { - type: 'text', - }).appendTo($('
', { - class: 'container-fluid', - }).appendTo(nContModalRet.body)); - - nContModalRet.confirmBtn?.on('click', () => { - const nameVal = nameInput.val(); - - if (nameVal && nameVal !== '' && typeof nameVal === 'string') { - nContModalRet.modal.modal('hide'); + let attrMeta = undefined; + if (metaDict && metaDict[val.type]) { + attrMeta = metaDict[val.type]; + attrMeta['metatype'] = val.type; + } - const defaultNewType = 'Scalar'; - const newMetaType = metaDict[defaultNewType]; + const row = $('
', { + class: 'row attr-table-row', + }).appendTo(attrTable); + attributeTablePutEntry( + descriptor, val, attrMeta, descriptors, undefined, + undefined, row, true, true, true, + (prop: KeyProperty) => { + // When a data container name is changed, update the data + // container and label for all access nodes referencing this + // data container. + const nVal = prop.getValue(); + if (nVal.valueChanged) { + const oldDescriptor = prop.getKey(); + const newDescriptor = nVal.value; + + doForAllNodeTypes( + sdfg, 'AccessNode', (accessNode: JsonSDFGNode) => { + if (accessNode.attributes?.data === + oldDescriptor) { + accessNode.attributes.data = newDescriptor; + accessNode.label = newDescriptor; + } + }, false + ); - const defaultValues: { - type: string, - attributes: any, - } = { - type: defaultNewType, - attributes: {}, - }; - for (const key in newMetaType) { - if (key === 'debuginfo') - continue; + prop.update(); - const val = newMetaType[key]; - if (Object.keys(val).includes('default')) - defaultValues.attributes[key] = val.default; + // Write back the change - this is necessary since we're + // overwriting the default handler which writes changes + // back when update-on-value-change is enabled. + const wholeSdfg = + VSCodeRenderer.getInstance()?.get_sdfg(); + if (wholeSdfg) + vscodeWriteGraph(wholeSdfg); } + }, undefined, true + ).then(res => { + if (res.deleteBtn) + res.deleteBtn.on('click', () => { + delete descriptors[descriptor]; + + const sdfg = VSCodeRenderer.getInstance()?.get_sdfg(); + if (sdfg) + vscodeWriteGraph(sdfg); + }); + }); + } - newMetaType['metatype'] = defaultNewType; + const addItemRowContainer = $('
', { + 'class': 'container-fluid attr-table', + }).appendTo(catContainer); + const addItemButtonRow = $('
', { + 'class': 'row', + }).appendTo(addItemRowContainer); + $('', { + 'class': 'material-icons property-add-row-btn', + 'text': 'playlist_add', + 'title': 'Add data container', + 'click': () => { + const nContModalRet = createSingleUseModal( + 'New Data Container Name', true, '' + ); - const newProp = attributeTablePutEntry( - nameVal, defaultValues, newMetaType, descriptors, - undefined, undefined, attrTable, true, true, true - ); - if (newProp) { - if (newProp.deleteBtn) - newProp.deleteBtn.on('click', () => { - if (newProp.key) { - delete descriptors[newProp.key]; + const nameInput = $('', { + type: 'text', + }).appendTo($('
', { + class: 'container-fluid', + }).appendTo(nContModalRet.body)); + + nContModalRet.confirmBtn?.on('click', () => { + const nameVal = nameInput.val(); + + if (nameVal && nameVal !== '' && + typeof nameVal === 'string') { + nContModalRet.modal.modal('hide'); + + const defaultNewType = 'Scalar'; + const newMetaType = metaDict[defaultNewType]; + + const defaultValues: { + type: string, + attributes: any, + } = { + type: defaultNewType, + attributes: {}, + }; + for (const key in newMetaType) { + if (key === 'debuginfo') + continue; + + const val = newMetaType[key]; + if (Object.keys(val).includes('default')) + defaultValues.attributes[key] = val.default; + } - const sdfg = - VSCodeRenderer.getInstance()?.get_sdfg(); - if (sdfg) - vscodeWriteGraph(sdfg); + newMetaType['metatype'] = defaultNewType; + + const row = $('
', { + class: 'row attr-table-row', + }).appendTo(attrTable); + attributeTablePutEntry( + nameVal, defaultValues, newMetaType, descriptors, + undefined, undefined, row, true, true, true, + undefined, undefined, true + ).then(newProp => { + if (newProp) { + if (newProp.deleteBtn) + newProp.deleteBtn.on('click', () => { + if (newProp.key) { + delete descriptors[newProp.key]; + + const sdfg = VSCodeRenderer + .getInstance()?.get_sdfg(); + if (sdfg) + vscodeWriteGraph(sdfg); + } + }); } }); - } - descriptors[nameVal] = defaultValues; - } - }); + descriptors[nameVal] = defaultValues; + } + }); - nContModalRet.modal.modal('show'); - }, - }).appendTo($('
', { - 'class': 'col-2', - }).appendTo(addItemButtonRow)); + nContModalRet.modal.modal('show'); + }, + }).appendTo($('
', { + 'class': 'col-2', + }).appendTo(addItemButtonRow)); + }); } diff --git a/src/webclients/components/sdfv/utils/helpers.ts b/src/webclients/components/sdfv/utils/helpers.ts index 4c1371e..f8dec58 100644 --- a/src/webclients/components/sdfv/utils/helpers.ts +++ b/src/webclients/components/sdfv/utils/helpers.ts @@ -3,6 +3,7 @@ import { AccessNode, + Edge, EntryNode, ExitNode, find_graph_element_by_uuid, @@ -301,6 +302,35 @@ export function elementUpdateLabel( } else if (element instanceof AccessNode && attributes.data) { element.data.node.label = attributes.data; } + } else if (element.data.label) { + if (element instanceof Edge) { + if (element.data.type === 'InterstateEdge') { + let condition = null; + if (element.data.attributes?.condition?.string_data) { + const strdata = + element.data.attributes.condition.string_data; + if (strdata !== '1' && strdata !== 1 && + strdata !== 'true' && strdata !== true) + condition = strdata; + } + let assignments = null; + if (element.data.attributes?.assignments) { + const assignDict = element.data.attributes.assignments; + const assignList = []; + for (const k in assignDict) + assignList.push( + k.toString() + '=' + assignDict[k].toString() + ); + assignments = assignList.join(', '); + } + let newLabel = ''; + if (condition) + newLabel += (condition + (assignments ? '; ' : '')); + if (assignments) + newLabel += assignments; + element.data.label = newLabel; + } + } } } } @@ -341,10 +371,16 @@ export function unGraphiphySdfg(g: JsonSDFG): void { export function vscodeWriteGraph(g: JsonSDFG): void { unGraphiphySdfg(g); + // Stringify with a replacer that removes undefined and sets it to null, + // so the values don't get dropped. if (vscode) vscode.postMessage({ type: 'dace.write_edit_to_sdfg', - sdfg: JSON.stringify(g), + sdfg: JSON.stringify( + g, (_k, v) => { + return v === undefined ? null : v; + } + ), }); } @@ -360,56 +396,66 @@ export function reselectRendererElement(elem: SDFGElement): void { } } -export function getTransformationMetadata(transformation: any): any { - let metadata = undefined; - const sdfgMetaDict = VSCodeSDFV.getInstance().getMetaDict(); +export async function getTransformationMetadata( + transformation: any +): Promise<{ [key: string ]: any}> { if (transformation.transformation) - metadata = sdfgMetaDict[transformation.transformation]; - return metadata; + return VSCodeSDFV.getInstance().getMetaDict().then(sdfgMetaDict => { + return sdfgMetaDict[transformation.transformation]; + }); + return {}; } -export function getElementMetadata(elem: any): any { - let metadata: any = undefined; - const sdfgMetaDict = VSCodeSDFV.getInstance().getMetaDict(); - if (elem instanceof SDFGElement) { - if (elem.data.sdfg) { - metadata = sdfgMetaDict[elem.data.sdfg.type]; - } else if (elem.data.state) { - metadata = sdfgMetaDict[elem.data.state.type]; - } else if (elem.data.node) { - const nodeType = elem.data.node.type; - if (elem instanceof ScopeNode) { - let nodeMeta = sdfgMetaDict[nodeType]; - let scopeMeta: any = undefined; - let entryIdx = nodeType.indexOf('Entry'); - let exitIdx = nodeType.indexOf('Exit'); - if (entryIdx) - scopeMeta = sdfgMetaDict[nodeType.substring(0, entryIdx)]; - else if (exitIdx) - scopeMeta = sdfgMetaDict[nodeType.substring(0, exitIdx)]; - - metadata = {}; - if (nodeMeta !== undefined) - Object.keys(nodeMeta).forEach(k => { - metadata[k] = nodeMeta[k]; - }); - if (scopeMeta !== undefined) - Object.keys(scopeMeta).forEach(k => { - metadata[k] = scopeMeta[k]; - }); - } else if (nodeType === 'LibraryNode') { - metadata = sdfgMetaDict[elem.data.node.classpath]; - } else { - metadata = sdfgMetaDict[nodeType]; +export async function getElementMetadata( + elem: any +): Promise<{ [key: string ]: any}> { + return VSCodeSDFV.getInstance().getMetaDict().then(sdfgMetaDict => { + if (typeof elem === 'string') { + return sdfgMetaDict[elem]; + } else if (elem instanceof SDFGElement) { + if (elem.data.sdfg) { + return sdfgMetaDict[elem.data.sdfg.type]; + } else if (elem.data.state) { + return sdfgMetaDict[elem.data.state.type]; + } else if (elem.data.node) { + const nodeType = elem.data.node.type; + if (elem instanceof ScopeNode) { + let nodeMeta = sdfgMetaDict[nodeType]; + let scopeMeta: any = undefined; + let entryIdx = nodeType.indexOf('Entry'); + let exitIdx = nodeType.indexOf('Exit'); + if (entryIdx) + scopeMeta = sdfgMetaDict[ + nodeType.substring(0, entryIdx) + ]; + else if (exitIdx) + scopeMeta = sdfgMetaDict[ + nodeType.substring(0, exitIdx) + ]; + + const metadata: { [key: string]: any } = {}; + if (nodeMeta !== undefined) + Object.keys(nodeMeta).forEach(k => { + metadata[k] = nodeMeta[k]; + }); + if (scopeMeta !== undefined) + Object.keys(scopeMeta).forEach(k => { + metadata[k] = scopeMeta[k]; + }); + return metadata; + } else if (nodeType === 'LibraryNode') { + return sdfgMetaDict[elem.data.node.classpath]; + } else { + return sdfgMetaDict[nodeType]; + } + } else if (elem.data.type) { + return sdfgMetaDict[elem.data.type]; } - } else if (elem.data.type) { - metadata = sdfgMetaDict[elem.data.type]; + } else if (elem.type) { + return sdfgMetaDict[elem.type]; } - } else if (elem.type) { - metadata = sdfgMetaDict[elem.type]; - } - - return metadata; + return {}; + }); } export function doForAllNodeTypes( diff --git a/src/webclients/components/sdfv/vscode_sdfv.css b/src/webclients/components/sdfv/vscode_sdfv.css index bfe40c1..95ad3bb 100644 --- a/src/webclients/components/sdfv/vscode_sdfv.css +++ b/src/webclients/components/sdfv/vscode_sdfv.css @@ -77,28 +77,29 @@ pre.code { /* View splitter */ -#split-container { - height: 100%; - width: 100%; - display: block; - position: relative; - overflow: hidden; -} - .gutter { background-color: var(--vscode-scrollbarSlider-background); background-repeat: no-repeat; background-position: 50%; + user-select: none; } .gutter.gutter-vertical { - background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAFAQMAAABo7865AAAABlBMVEVHcEzMzMzyAv2sAAAAAXRSTlMAQObYZgAAABBJREFUeF5jOAMEEAIEEFwAn3kMwcB6I2AAAAAASUVORK5CYII='); - cursor: row-resize; + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAeCAYAAADkftS9AAAAIklEQVQoU2M4c+bMfxAGAgYYmwGrIIiDjrELjpo5aiZeMwF+yNnOs5KSvgAAAABJRU5ErkJggg=='); + cursor: col-resize; + position: absolute; + left: 0; + height: 100%; + width: 12px; } .gutter.gutter-horizontal { - background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAeCAYAAADkftS9AAAAIklEQVQoU2M4c+bMfxAGAgYYmwGrIIiDjrELjpo5aiZeMwF+yNnOs5KSvgAAAABJRU5ErkJggg=='); - cursor: col-resize; + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAFAQMAAABo7865AAAABlBMVEVHcEzMzMzyAv2sAAAAAXRSTlMAQObYZgAAABBJREFUeF5jOAMEEAIEEFwAn3kMwcB6I2AAAAAASUVORK5CYII='); + cursor: row-resize; + position: absolute; + top: 0; + width: 100%; + height: 12px; } /* End view splitter */ @@ -239,25 +240,34 @@ pre.code { /* Info container/box */ #info-container { - width: 100%; - height: 100%; overflow-y: scroll; + background-color: var(--vscode-editor-background); + color: var(--vscode-editor-foreground); + min-width: 570px; + min-height: 200px; } -.split-container-vertical>#info-container { - padding-top: .5rem; +#info-header { + display: flex; + flex-direction: row; + align-items: baseline; + padding-bottom: .5rem; + padding-left: 1rem; } -.split-container-horizontal>#info-container { - padding-left: .5rem; - padding-right: .5rem; +#info-header > .btn-close { + color: var(--vscode-button-foreground); } -#info-header { +#title-btns-container { + margin-top: .2rem; display: flex; flex-direction: row; - align-items: baseline; - padding-bottom: .5rem; +} + +#info-title { + text-overflow: clip; + overflow: hidden; } .flex-spacer { @@ -267,27 +277,49 @@ pre.code { #goto-source-btn, #goto-cpp-btn { font-size: .9rem; - margin: .2rem 0 .2rem 1rem; + margin-right: .2rem; } -#info-clear-btn { +#layout-toggle-btn, +#info-close-btn { + cursor: pointer; font-size: .9rem; - margin: .2rem 1rem; + margin: .2rem; } -#info-clear-btn span { +#layout-toggle-btn span, +#info-close-btn span { display: block; height: 100%; } -#info-clear-btn .material-icons { +#layout-toggle-btn .material-icons, +#info-close-btn .material-icons { display: inline-flex; vertical-align: middle; } +#info-header-btn-container { + display: flex; + flex-direction: row; +} + +#layout-toggle-btn.vertical span .material-icons { + transform: rotate(90deg); +} + +#expand-info-btn { + cursor: pointer; + position: absolute; + bottom: 0; + right: 0; + margin: .4rem; +} + #info-contents { width: 100%; margin-bottom: 1rem; + padding-left: 1rem; } #info-contents .info-subtitle { @@ -563,3 +595,12 @@ pre.code { margin-top: .5rem; margin-bottom: .5rem; } + +#minimap-close-button { + position: absolute; + top: .5rem; + right: .5rem; + cursor: pointer; + user-select: none; + color: black; +} diff --git a/src/webclients/components/sdfv/vscode_sdfv.ts b/src/webclients/components/sdfv/vscode_sdfv.ts index e22fc44..eeaed08 100644 --- a/src/webclients/components/sdfv/vscode_sdfv.ts +++ b/src/webclients/components/sdfv/vscode_sdfv.ts @@ -73,11 +73,10 @@ import { showContextMenu, vscodeWriteGraph, } from './utils/helpers'; -import Split from 'split.js'; import { LViewRenderer } from '@spcl/sdfv/out/local_view/lview_renderer'; declare const vscode: any; -declare const SPLIT_DIRECTION: 'vertical' | 'horizontal'; +declare let SPLIT_DIRECTION: 'vertical' | 'horizontal'; type CategorizedTransformationList = [ JsonTransformation[], @@ -114,13 +113,15 @@ export class VSCodeSDFV extends SDFV { private monaco: any | null = null; private sdfgString: string | null = null; private sdfgMetaDict: { [key: string]: any } | null = null; - private queryingMetaDict: boolean = false; + private queryMetaDictFunc: Promise<{ [key: string]: any }> | null= null; private viewingHistoryState: boolean = false; private showingBreakpoints: boolean = false; private daemonConnected: boolean = false; private transformations: CategorizedTransformationList = [[], [], [], []]; private selectedTransformation: JsonTransformation | null = null; + public infoTrayExplicitlyHidden: boolean = false; + public init_menu(): void { this.initInfoBox(); } @@ -163,8 +164,9 @@ export class VSCodeSDFV extends SDFV { /** * Show the info box and its necessary components. */ - public infoBoxShow(): void { - $('#info-clear-btn').show(); + public infoBoxShow(overrideHidden: boolean = false): void { + if (!this.infoTrayExplicitlyHidden || overrideHidden) + $('#info-container').addClass('show'); } /** @@ -177,17 +179,14 @@ export class VSCodeSDFV extends SDFV { /** * Clear the info container and its title, and hide the clear button again. */ - public clearInfoBox(): void { + public clearInfoBox(hide: boolean = false): void { $('#info-contents').html(''); $('#info-title').text(''); - $('#info-clear-btn').hide(); $('#goto-source-btn').hide(); $('#goto-cpp-btn').hide(); this.selectedTransformation = null; - if (vscode) - vscode.postMessage({ - type: 'transformation_list.deselect', - }); + if (hide) + $('#info-container').removeClass('show'); } private handleShowGroupsContextMenu( @@ -457,7 +456,10 @@ export class VSCodeSDFV extends SDFV { $('
').appendTo(contents); } - generateAttributesTable(elem, undefined, contents); + const tableContainer = $('
', { + 'class': 'container-fluid attr-table-base-container', + }).appendTo(contents); + generateAttributesTable(elem, undefined, tableContainer); if (elem instanceof AccessNode) { // If we're processing an access node, add array info too. @@ -471,7 +473,10 @@ export class VSCodeSDFV extends SDFV { }).appendTo(contents); // TODO: Allow container types to be changed here too. - generateAttributesTable(sdfg_array, undefined, contents); + const tableContainer = $('
', { + 'class': 'container-fluid attr-table-base-container', + }).appendTo(contents); + generateAttributesTable(sdfg_array, undefined, tableContainer); } else if (elem instanceof NestedSDFG) { // If nested SDFG, add SDFG info too. const sdfg_sdfg = elem.attributes().sdfg; @@ -481,7 +486,10 @@ export class VSCodeSDFV extends SDFV { 'text': 'SDFG properties:', }).appendTo(contents); - generateAttributesTable(sdfg_sdfg, undefined, contents); + const tableContainer = $('
', { + 'class': 'container-fluid attr-table-base-container', + }).appendTo(contents); + generateAttributesTable(sdfg_sdfg, undefined, tableContainer); } else if (elem instanceof ScopeNode) { // If we're processing a scope node, we want to append the exit // node's props when selecting an entry node, and vice versa. @@ -513,7 +521,12 @@ export class VSCodeSDFV extends SDFV { other_element.type() + ' ' + other_element.label(), }).appendTo(contents); - generateAttributesTable(other_element, undefined, contents); + const tableContainer = $('
', { + 'class': 'container-fluid attr-table-base-container', + }).appendTo(contents); + generateAttributesTable( + other_element, undefined, tableContainer + ); } } else if (elem instanceof SDFG) { if (elem.data && elem.data.attributes) @@ -528,8 +541,6 @@ export class VSCodeSDFV extends SDFV { elem.data.node.attributes.sdfg ); } - - $('#info-clear-btn').show(); } else { this.clearInfoBox(); } @@ -685,32 +696,28 @@ export class VSCodeSDFV extends SDFV { return this.sdfgString; } - public getMetaDict(): { [key: string]: any } { + public async getMetaDict(): Promise<{ [key: string]: any }> { if (!this.sdfgMetaDict) { // If SDFG property metadata isn't available, use the static one and // query an up-to-date one from the dace github page. If that // doesn't work, query the daemon (waking it up if it isn't up). - if (!this.queryingMetaDict) { - this.queryingMetaDict = true; - fetch( + if (!this.queryMetaDictFunc) + this.queryMetaDictFunc = fetch( 'https://spcl.github.io/dace/metadata/sdfg_meta_dict.json' ).then( (response) => response.json() - ).then( - (data) => { - this.sdfgMetaDict = data; - this.queryingMetaDict = false; - } - ).catch( - (_reason) => { - vscode.postMessage({ - type: 'dace.query_sdfg_metadata', - }); - return staticSdfgMetaDict; - } ); - } - return staticSdfgMetaDict; + + return this.queryMetaDictFunc.then((data) => { + this.sdfgMetaDict = data; + this.queryMetaDictFunc = null; + return this.sdfgMetaDict; + }).catch((reason) => { + console.error(reason); + this.sdfgMetaDict = staticSdfgMetaDict; + this.queryMetaDictFunc = null; + return this.sdfgMetaDict; + }); } return this.sdfgMetaDict; } @@ -801,6 +808,7 @@ export class VSCodeSDFV extends SDFV { this.renderer = null; } this.localViewRenderer = localViewRenderer; + this.infoBoxShow(true); } } @@ -849,11 +857,93 @@ export function vscodeHandleEvent(event: string, data: any): void { } $(() => { - Split(['#contents', '#info-container'], { - sizes: [60, 40], - minSize: [0, 0], - snapOffset: 10, - direction: SPLIT_DIRECTION, + const infoContainer = $('#info-container'); + const layoutToggleBtn = $('#layout-toggle-btn'); + const infoDragBar = $('#info-drag-bar'); + const expandInfoBtn = $('#expand-info-btn'); + const infoCloseBtn = $('#info-close-btn'); + + // Set up resizing of the info drawer. + let draggingDragInfoBar = false; + let lastVertWidth = infoContainer.css('min-width'); + let lastHorHeight = infoContainer.css('min-height'); + const infoChangeHeightHandler = (e: any) => { + if (draggingDragInfoBar) { + const documentHeight = $('body').height(); + if (documentHeight) { + const newHeight = documentHeight - e.originalEvent.y; + if (newHeight < documentHeight) { + infoContainer.height(newHeight); + lastHorHeight = newHeight.toString() + 'px'; + } + } + } + }; + const infoChangeWidthHandler = (e: any) => { + if (draggingDragInfoBar) { + const documentWidth = $('body').width(); + if (documentWidth) { + const newWidth = documentWidth - e.originalEvent.x; + if (newWidth < documentWidth) { + infoContainer.width(newWidth); + lastVertWidth = newWidth.toString() + 'px'; + } + } + } + }; + $(document).on('mouseup', () => { + draggingDragInfoBar = false; + }); + infoDragBar.on('mousedown', () => { + draggingDragInfoBar = true; + }); + if (SPLIT_DIRECTION === 'vertical') + $(document).on('mousemove', infoChangeWidthHandler); + else + $(document).on('mousemove', infoChangeHeightHandler); + + // Set up changing the info drawer layout. + layoutToggleBtn.on('click', () => { + const oldDir = SPLIT_DIRECTION; + SPLIT_DIRECTION = SPLIT_DIRECTION === 'vertical' ? + 'horizontal' : 'vertical'; + layoutToggleBtn.removeClass(oldDir); + layoutToggleBtn.addClass(SPLIT_DIRECTION); + if (oldDir === 'vertical') { + infoContainer.removeClass('offcanvas-end'); + infoContainer.addClass('offcanvas-bottom'); + infoDragBar.removeClass('gutter-vertical'); + infoDragBar.addClass('gutter-horizontal'); + $(document).off('mousemove', infoChangeWidthHandler); + $(document).on('mousemove', infoChangeHeightHandler); + infoContainer.width('100%'); + infoContainer.height(lastHorHeight); + } else { + infoContainer.removeClass('offcanvas-bottom'); + infoContainer.addClass('offcanvas-end'); + infoDragBar.removeClass('gutter-horizontal'); + infoDragBar.addClass('gutter-vertical'); + $(document).off('mousemove', infoChangeHeightHandler); + $(document).on('mousemove', infoChangeWidthHandler); + infoContainer.height('100%'); + infoContainer.width(lastVertWidth); + } + vscode.postMessage({ + type: 'sdfv.set_split_direction', + direction: SPLIT_DIRECTION, + }); + }); + + // Set up toggling the info tray. + infoCloseBtn.on('click', () => { + expandInfoBtn.show(); + infoContainer.removeClass('show'); + VSCodeSDFV.getInstance().infoTrayExplicitlyHidden = true; + }); + expandInfoBtn.on('click', () => { + expandInfoBtn.hide(); + infoContainer.addClass('show'); + VSCodeSDFV.getInstance().infoTrayExplicitlyHidden = false; }); $('#processing-overlay').hide(); @@ -892,10 +982,6 @@ $(() => { VSCodeSDFV.getInstance().toggleBreakpoints(); }); - $('#info-clear-btn').on('click', () => { - VSCodeSDFV.getInstance().clearInfoBox(); - }); - window.addEventListener('message', (e) => { MessageHandler.getInstance().handleMessage(e.data); }); diff --git a/src/webclients/components/transformations/transformations.css b/src/webclients/components/transformations/transformations.css index 114b97c..0e44eea 100644 --- a/src/webclients/components/transformations/transformations.css +++ b/src/webclients/components/transformations/transformations.css @@ -73,30 +73,47 @@ body { width: 100%; } -.tree-view-list { +.transformation-category, +.transformation { width: 100%; } -.tree-view-item.hover { +.transformation-category.hover, +.transformation.hover { cursor: pointer; background-color: var(--vscode-list-hoverBackground); } -.tree-view-item { +.transformation-category, +.transformation { padding-left: .2rem; padding-right: .2rem; } -.tree-view-item.selected { +.transformation.selected { color: var(--vscode-list-activeSelectionForeground) !important; background-color: var(--vscode-list-activeSelectionBackground) !important; } -.tree-view-item.selected .transformation-list-quick-apply { +.transformation.selected .transformation-list-quick-apply { color: var(--vscode-list-activeSelectionForeground) !important; background-color: var(--vscode-list-activeSelectionBackground) !important; } +.transformation-group { + border: 2px solid transparent; + padding: .2rem; +} + +.transformation-group.hover { + cursor: pointer; + border-color: var(--vscode-list-hoverBackground) !important; +} + +.transformation-group.selected { + border-color: var(--vscode-list-activeSelectionBackground) !important; +} + .transformation-list-item-label-container { display: flex; flex-direction: row; @@ -104,14 +121,22 @@ body { align-items: center; } +.transformation-list-item-label-container > .tree-view-item-label > span, .transformation-list-item-label-container > .tree-view-item-label { overflow: hidden; flex-shrink: 1; flex-grow: 1; } +.transformation-list-item-label-container > .tree-view-item-label > span { + text-overflow: clip; + white-space: nowrap; +} + +.transformation-list-apply-all, .transformation-list-quick-apply { display: none; + white-space: nowrap; } .transformation-list-item-label-container.hover-direct .transformation-list-quick-apply { @@ -121,4 +146,12 @@ body { flex-shrink: 0; white-space: nowrap; overflow: visible; -} \ No newline at end of file +} + +.transformation-list-item-label-container.hover-direct .transformation-list-apply-all { + padding-left: .8rem; + display: block; + flex-shrink: 0; + white-space: nowrap; + overflow: visible; +} diff --git a/src/webclients/components/transformations/transformations.ts b/src/webclients/components/transformations/transformations.ts index e1ab254..ade89e8 100644 --- a/src/webclients/components/transformations/transformations.ts +++ b/src/webclients/components/transformations/transformations.ts @@ -53,15 +53,22 @@ class TransformationCategory extends TransformationListItem { ); } + public generateHtml(): JQuery { + const item = super.generateHtml(); + item.addClass('transformation-category'); + return item; + } + } export type JsonTransformation = { - transformation: string | undefined, + transformation: string, type: string | undefined, exp_idx: number | undefined, sdfg_id: number | undefined, state_id: number | undefined, _subgraph: any | undefined, + docstring: string | undefined }; export class Transformation extends TransformationListItem { @@ -74,25 +81,18 @@ export class Transformation extends TransformationListItem { private subgraph: any | undefined = undefined; public constructor( - private json: any, list: TransformationList + private json: JsonTransformation, list: TransformationList ) { super( - json.transformation, - json.type === 'SubgraphTransformation' ? - 'Subgraph Transformation\n' + json.docstring : json.docstring, - '', false, true, - json.type === 'SubgraphTransformation' ? - 'color: var(--vscode-gitDecoration-addedResourceForeground);' : - '', - '' + json.transformation, json.docstring, undefined, false, true, '', '' ); this.list = list; this.name = json.transformation; this.type = json.type; - this.expressionIndex = json.expr_index; - this.sdfgId = json.sdfg_id; - this.stateId = json.state_id; + this.expressionIndex = json.exp_idx; + this.sdfgId = json.sdfg_id ?? 0; + this.stateId = json.state_id ?? 0; this.subgraph = json._subgraph; } @@ -121,6 +121,8 @@ export class Transformation extends TransformationListItem { public generateHtml(): JQuery { const item = super.generateHtml(); + item.addClass('transformation'); + item.on('click', () => { if (vscode) { if (this.list !== undefined) { @@ -143,8 +145,8 @@ export class Transformation extends TransformationListItem { 'title': 'Apply transformation with default parameters', 'click': () => { vscode.postMessage({ - type: 'sdfv.apply_transformation', - transformation: this.json, + type: 'sdfv.apply_transformations', + transformations: [this.json], }); }, }).appendTo(labelContainer); @@ -167,6 +169,69 @@ export class Transformation extends TransformationListItem { } +export class TransformationGroup extends TransformationListItem { + + public constructor( + public readonly groupName: string, + public readonly transformations: JsonTransformation[], + public readonly list: TransformationList, + labelStyle: string, + private allowApplyAll: boolean = false + ) { + super( + groupName, groupName === 'SubgraphTransformations' ? + undefined : transformations[0].docstring, + undefined, false, false, + labelStyle, '' + ); + + for (const xf of transformations) + this.addItem(new Transformation(xf, list)); + } + + public generateHtml(): JQuery { + const item = super.generateHtml(); + + item.addClass('transformation-group'); + + const labelContainer = + item.find('.tree-view-item-label-container').first(); + labelContainer.addClass('transformation-list-item-label-container'); + + if (this.allowApplyAll) + $('
', { + class: 'transformation-list-apply-all', + text: 'Apply All', + title: 'Apply all transformations with default parameters', + click: () => { + vscode.postMessage({ + type: 'sdfv.apply_transformations', + transformations: this.transformations, + }); + }, + }).appendTo(labelContainer); + + item.on('mouseover', () => { + labelContainer.addClass('hover-direct'); + const affectedUUIDs = []; + if (this.children) + for (const item of (this.children as Transformation[])) + affectedUUIDs.push(...item.getAffectedElementsUUIDs()); + vscode.postMessage({ + type: 'sdfv.highlight_elements', + elements: affectedUUIDs, + }); + }); + + item.on('mouseout', () => { + labelContainer.removeClass('hover-direct'); + }); + + return item; + } + +} + class TransformationList extends CustomTreeView { static CAT_SELECTION_IDX = 0; @@ -230,7 +295,7 @@ class TransformationList extends CustomTreeView { return count; } - public setTransformations(transformations: Transformation[][]): void { + public setTransformations(transformations: JsonTransformation[][]): void { this.clear('', false); // Make sure the transformations received are the same length, if not, @@ -245,11 +310,38 @@ class TransformationList extends CustomTreeView { for (let i = 0; i < this.items.length; i++) { const category = transformations[i]; + const groups: { [key: string]: JsonTransformation[] } = {}; + const subgraphTransformations = []; for (let j = 0; j < category.length; j++) { const transformation = category[j]; - this.items[i].addItem( - new Transformation(transformation, this) - ); + if (transformation.type === 'SubgraphTransformation') { + subgraphTransformations.push(transformation); + } else { + if (groups[transformation.transformation]) + groups[transformation.transformation].push( + transformation + ); + else + groups[transformation.transformation] = [ + transformation + ]; + } + } + + const sgGrpColor = 'vscode-textPreformat-foreground'; + const xfGrpColor = 'vscode-textLink-foreground'; + if (subgraphTransformations.length) + this.items[i].addItem(new TransformationGroup( + 'SubgraphTransformations', subgraphTransformations, + this, 'color: var(--' + sgGrpColor + ');', + false + )); + for (const grpName in groups) { + const xfList = groups[grpName]; + this.items[i].addItem(new TransformationGroup( + grpName, xfList, this, 'color: var(--' + xfGrpColor + ');', + true + )); } } diff --git a/src/webclients/elements/treeview/treeview.ts b/src/webclients/elements/treeview/treeview.ts index 496bdfb..6037293 100644 --- a/src/webclients/elements/treeview/treeview.ts +++ b/src/webclients/elements/treeview/treeview.ts @@ -9,14 +9,14 @@ export class CustomTreeViewItem { public element: any = undefined; public constructor( - private label: string, - private tooltip: string | undefined, - private icon: string | undefined, - private collapsed: boolean, - private unfoldDoubleClick: boolean, - private labelStyle: string | undefined = undefined, - private iconStyle: string | undefined = undefined, - private readonly MEDIA_DIR: string | undefined = undefined + protected label: string, + protected tooltip: string | undefined, + protected icon: string | undefined, + protected collapsed: boolean, + protected unfoldDoubleClick: boolean, + protected labelStyle: string | undefined = undefined, + protected iconStyle: string | undefined = undefined, + protected readonly MEDIA_DIR: string | undefined = undefined ) { } @@ -196,4 +196,4 @@ export class CustomTreeView { this.generateHtml(); } -} \ No newline at end of file +}