From e5a1997cc6dc209c92bbb0a2115fc3f02540308a Mon Sep 17 00:00:00 2001 From: AnHeuermann <38031952+AnHeuermann@users.noreply.github.com> Date: Wed, 17 Apr 2024 17:42:26 +0200 Subject: [PATCH] Initial commit - Started from https://github.com/OpenModelica/modelica-language-server/releases/tag/v0.1.0 --- .eslintignore | 5 + .eslintrc.js | 20 + .github/dependabot | 11 + .github/workflows/test.yml | 73 + .gitignore | 4 + .vscode/extensions.json | 9 + .vscode/launch.json | 41 + .vscode/settings.json | 8 + .vscode/tasks.json | 33 + .vscodeignore | 16 + OSMC-License.txt | 273 ++ README.md | 119 + client/package-lock.json | 304 +++ client/package.json | 23 + client/src/extension.ts | 125 + client/src/getLanguage.ts | 64 + client/src/test/helper.ts | 70 + client/src/test/index.ts | 74 + client/src/test/runTest.ts | 58 + client/src/test/symbolinformation.test.ts | 131 + client/testFixture/MyLibrary.mo | 7 + client/tsconfig.json | 20 + esbuild.config.js | 39 + images/Modelica_Language_marging.jpg | Bin 0 -> 43709 bytes images/outline_demo.png | Bin 0 -> 250420 bytes package-lock.json | 2737 +++++++++++++++++++++ package.json | 69 + scripts/e2e.sh | 6 + server/package-lock.json | 486 ++++ server/package.json | 22 + server/src/analyzer.ts | 103 + server/src/parser.ts | 64 + server/src/server.ts | 173 ++ server/src/test/server.test.ts | 62 + server/src/tree-sitter-metamodelica.wasm | Bin 0 -> 143043 bytes server/src/util/declarations.ts | 156 ++ server/src/util/logger.ts | 168 ++ server/src/util/test/declarations.test.ts | 84 + server/src/util/test/util.test.ts | 50 + server/src/util/tree-sitter.ts | 171 ++ server/tsconfig.json | 26 + tsconfig.json | 27 + 42 files changed, 5931 insertions(+) create mode 100644 .eslintignore create mode 100644 .eslintrc.js create mode 100644 .github/dependabot create mode 100644 .github/workflows/test.yml create mode 100644 .gitignore create mode 100644 .vscode/extensions.json create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json create mode 100644 .vscode/tasks.json create mode 100644 .vscodeignore create mode 100644 OSMC-License.txt create mode 100644 README.md create mode 100644 client/package-lock.json create mode 100644 client/package.json create mode 100644 client/src/extension.ts create mode 100644 client/src/getLanguage.ts create mode 100644 client/src/test/helper.ts create mode 100644 client/src/test/index.ts create mode 100644 client/src/test/runTest.ts create mode 100644 client/src/test/symbolinformation.test.ts create mode 100644 client/testFixture/MyLibrary.mo create mode 100644 client/tsconfig.json create mode 100644 esbuild.config.js create mode 100644 images/Modelica_Language_marging.jpg create mode 100644 images/outline_demo.png create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 scripts/e2e.sh create mode 100644 server/package-lock.json create mode 100644 server/package.json create mode 100644 server/src/analyzer.ts create mode 100644 server/src/parser.ts create mode 100644 server/src/server.ts create mode 100644 server/src/test/server.test.ts create mode 100644 server/src/tree-sitter-metamodelica.wasm create mode 100644 server/src/util/declarations.ts create mode 100644 server/src/util/logger.ts create mode 100644 server/src/util/test/declarations.test.ts create mode 100644 server/src/util/test/util.test.ts create mode 100644 server/src/util/tree-sitter.ts create mode 100644 server/tsconfig.json create mode 100644 tsconfig.json diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..516ecd8 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,5 @@ +node_modules/** +client/node_modules/** +client/out/** +server/node_modules/** +server/out/** diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..10793c5 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,20 @@ +/**@type {import('eslint').Linter.Config} */ +// eslint-disable-next-line no-undef +module.exports = { + root: true, + parser: '@typescript-eslint/parser', + plugins: [ + '@typescript-eslint', + ], + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + ], + rules: { + 'semi': [2, "always"], + '@typescript-eslint/no-unused-vars': 0, + '@typescript-eslint/no-explicit-any': 0, + '@typescript-eslint/explicit-module-boundary-types': 0, + '@typescript-eslint/no-non-null-assertion': 0, + } +}; diff --git a/.github/dependabot b/.github/dependabot new file mode 100644 index 0000000..ee14e9d --- /dev/null +++ b/.github/dependabot @@ -0,0 +1,11 @@ +version: 2 +updates: + - package-ecosystem: npm + directory: / + schedule: + interval: monthly + + - package-ecosystem: github-actions + directory: / + schedule: + interval: monthly diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..c53d18e --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,73 @@ +name: Build + +on: + push: + branches: + - main + tags: + - "v*.*.*" + pull_request: + branches: + - main + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup npm + uses: actions/setup-node@v4 + with: + node-version: 20 + registry-url: https://registry.npmjs.org/ + + - name: Install X server + run: | + sudo apt-get update + sudo apt-get install -y xvfb + + - name: Install the dependencies + run: npm clean-install && npm run postinstall + + - name: Build package + run: npm run esbuild + + - name: Test language server + run: npm run test:server + + - name: Test language server client + run: | + Xvfb -ac :99 -screen 0 1280x1024x16 & + export DISPLAY=:99 + npm run test + + - name: Package Extension + run: npx vsce package + + - name: Archive vsix package + uses: actions/upload-artifact@v4 + with: + name: metamodelica-language-server.vsix + path: metamodelica-language-server-*.vsix + + release: + if: startsWith(github.ref, 'refs/tags/') + needs: build + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - uses: actions/download-artifact@v4 + with: + name: metamodelica-language-server.vsix + + - name: Release + uses: softprops/action-gh-release@v1 + with: + files: | + metamodelica-language-server-*.vsix + fail_on_unmatched_files: true + generate_release_notes: true + append_body: true diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7500239 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.vscode-test +metamodelica-language-server*.vsix +node_modules/ +out/ diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..ab9aeb2 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,9 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=827846 to learn about workspace recommendations. + // Extension identifier format: ${publisher}.${name}. Example: vscode.csharp + // List of extensions which should be recommended for users of this workspace. + "recommendations": [ + "dbaeumer.vscode-eslint", + "AnHeuermann.metamodelica" + ] +} diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..f5b149e --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,41 @@ +// A launch configuration that compiles the extension and then opens it inside a +// new window +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Launch Client", + "type": "extensionHost", + "request": "launch", + "runtimeExecutable": "${execPath}", + "args": [ + "--extensionDevelopmentPath=${workspaceRoot}" + ], + "outFiles": [ + "${workspaceRoot}/out/**/*.js" + ], + "preLaunchTask": { + "type": "npm", + "script": "esbuild-watch" + } + }, + { + "name": "Language Server E2E Test", + "type": "extensionHost", + "request": "launch", + "runtimeExecutable": "${execPath}", + "args": [ + "--extensionDevelopmentPath=${workspaceRoot}", + "--extensionTestsPath=${workspaceRoot}/client/out/test/index", + "${workspaceRoot}/client/testFixture" + ], + "outFiles": [ + "${workspaceRoot}/client/out/test/**/*.js" + ], + "preLaunchTask": { + "type": "npm", + "script": "test-compile" + } + } + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..2fb4fd9 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,8 @@ +{ + "editor.insertSpaces": false, + "typescript.tsc.autoDetect": "off", + "typescript.preferences.quoteStyle": "single", + "editor.codeActionsOnSave": { + "source.fixAll.eslint": "explicit" + } +} diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..adabbde --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,33 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "type": "npm", + "script": "esbuild", + "group": "build", + "presentation": { + "panel": "dedicated", + "reveal": "never" + }, + "problemMatcher": [ + "$tsc" + ] + }, + { + "type": "npm", + "script": "esbuild-watch", + "isBackground": true, + "group": { + "kind": "build", + "isDefault": true + }, + "presentation": { + "panel": "dedicated", + "reveal": "never" + }, + "problemMatcher": [ + "$tsc-watch" + ] + } + ] +} diff --git a/.vscodeignore b/.vscodeignore new file mode 100644 index 0000000..53186a8 --- /dev/null +++ b/.vscodeignore @@ -0,0 +1,16 @@ +!server/OSMC-License.txt +.eslintignore +.github +.gitignore +.travis.yml +.vscode/** +**/*.map +**/*.ts +**/tsconfig.base.json +**/tsconfig.json +client/ +contributing.md +esbuild.config.js +node_modules/ +scripts/ +server/ diff --git a/OSMC-License.txt b/OSMC-License.txt new file mode 100644 index 0000000..5f8d87b --- /dev/null +++ b/OSMC-License.txt @@ -0,0 +1,273 @@ +--- Start of Definition of OSMC Public License --- + +/* + * This file is part of OpenModelica. + * + * Copyright (c) 1998-CurrentYear, Open Source Modelica Consortium (OSMC), + * c/o Linköpings universitet, Department of Computer and Information Science, + * SE-58183 Linköping, Sweden. + * + * All rights reserved. + * + * THIS PROGRAM IS PROVIDED UNDER THE TERMS OF AGPL VERSION 3 LICENSE OR + * THIS OSMC PUBLIC LICENSE (OSMC-PL) VERSION 1.8. + * ANY USE, REPRODUCTION OR DISTRIBUTION OF THIS PROGRAM CONSTITUTES + * RECIPIENT'S ACCEPTANCE OF THE OSMC PUBLIC LICENSE OR THE GNU AGPL + * VERSION 3, ACCORDING TO RECIPIENTS CHOICE. + * + * The OpenModelica software and the OSMC (Open Source Modelica Consortium) + * Public License (OSMC-PL) are obtained from OSMC, either from the above + * address, from the URLs: + * http://www.openmodelica.org or + * https://github.com/OpenModelica/ or + * http://www.ida.liu.se/projects/OpenModelica, + * and in the OpenModelica distribution. + * + * GNU AGPL version 3 is obtained from: + * https://www.gnu.org/licenses/licenses.html#GPL + * + * This program is distributed WITHOUT ANY WARRANTY; without + * even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE, EXCEPT AS EXPRESSLY SET FORTH + * IN THE BY RECIPIENT SELECTED SUBSIDIARY LICENSE CONDITIONS OF OSMC-PL. + * + * See the full OSMC Public License conditions for more details. + * + */ + +--- End of OSMC Public License Header --- + +The OSMC-PL is a public license for OpenModelica with three modes/alternatives +(AGPL, OSMC-Internal-EPL, OSMC-External-EPL) for use and redistribution, +in source and/or binary/object-code form: + +* AGPL. Any party (member or non-member of OSMC) may use and redistribute + OpenModelica under GNU AGPL version 3. + +* Level 1 members of OSMC may also use and redistribute OpenModelica under + OSMC-Internal-EPL conditions. + +* Level 2 members of OSMC may also use and redistribute OpenModelica under + OSMC-Internal-EPL or OSMC-External-EPL conditions. +Definitions of OSMC Public license modes: + +* AGPL = GNU AGPL version 3. + +* OSMC-Internal-EPL = These OSMC Public license conditions together with + Internally restricted EPL, i.e., EPL version 1.0 with the Additional + Condition that use and redistribution by an OSMC member is only allowed + within the OSMC member's own organization (i.e., its own legal entity), + or for an OSMC member paying an annual fee corresponding to the size + of the organization including all its affiliates, use and redistribution + is allowed within/between its affiliates. + +* OSMC-External-EPL = These OSMC Public license conditions together with + Externally restricted EPL, i.e., EPL version 1.0 with the Additional + Condition that use and redistribution by an OSMC member, or by a Licensed + Third Party Distributor having a redistribution agreement with that member, + to parties external to the OSMC member’s own organization (i.e., its own + legal entity) is only allowed in binary/object-code form, except the case of + redistribution to other OSMC members to which source is also allowed to be + distributed. + +[This has the consequence that an external party who wishes to use + OpenModelica in source form together with its own proprietary software in all + cases must be a member of OSMC]. + +In all cases of usage and redistribution by recipients, the following +conditions also apply: + +a) Redistributions of source code must retain the above copyright notice, + all definitions, and conditions. It is sufficient if the OSMC-PL Header + is present in each source file, if the full OSMC-PL is available in a + prominent and easily located place in the redistribution. + +b) Redistributions in binary/object-code form must reproduce the above + copyright notice, all definitions, and conditions. It is sufficient if the + OSMC-PL Header and the location in the redistribution of the full OSMC-PL + are present in the documentation and/or other materials provided with the + redistribution, if the full OSMC-PL is available in a prominent and easily + located place in the redistribution. + +c) A recipient must clearly indicate its chosen usage mode of OSMC-PL, + in accompanying documentation and in a text file OSMC-USAGE-MODE.txt, + provided with the distribution. + +d) Contributor(s) making a Contribution to OpenModelica thereby also makes a + Transfer of Contribution Copyright. In return, upon the effective date of + the transfer, OSMC grants the Contributor(s) a Contribution License of the + Contribution. OSMC has the right to accept or refuse Contributions. + +Definitions: + +"Subsidiary license conditions" means: + +The additional license conditions depending on the by the recipient chosen + mode of OSMC-PL, defined by GNU AGPL version 3.0 for AGPL, and by EPL for + OSMC-Internal-EPL and OSMC-External-EPL. +"OSMC-PL" means: + +Open Source Modelica Consortium Public License version 1.8, i.e., the license +defined here (the text between +"--- Start of Definition of OSMC Public License ---" and +"--- End of Definition of OSMC Public License ---", or later versions thereof. + +"OSMC-PL Header" means: + +Open Source Modelica Consortium Public License Header version 1.8, i.e., the +text between "--- Start of Definition of OSMC Public License ---" and +"--- End of OSMC Public License Header ---", or later versions thereof. + +"Contribution" means: + +a) in the case of the initial Contributor, the initial code and documentation + distributed under OSMC-PL, and + +b) in the case of each subsequent Contributor: + i) changes to OpenModelica, and + ii) additions to OpenModelica; + +where such changes and/or additions to OpenModelica originate from and are +distributed by that particular Contributor. A Contribution 'originates' from +a Contributor if it was added to OpenModelica by such Contributor itself or +anyone acting on such Contributor's behalf. + +For Contributors licensing OpenModelica under OSMC-Internal-EPL or +OSMC-External-EPL conditions, the following conditions also hold: + +Contributions do not include additions to the distributed Program which: (i) +are separate modules of software distributed in conjunction with OpenModelica +under their own license agreement, (ii) are separate modules which are not +derivative works of OpenModelica, and (iii) are separate modules of software +distributed in conjunction with OpenModelica under their own license agreement +where these separate modules are merged with (weaved together with) modules of +OpenModelica to form new modules that are distributed as object code or source +code under their own license agreement, as allowed under the Additional +Condition of internal distribution according to OSMC-Internal-EPL and/or +Additional Condition for external distribution according to OSMC-External-EPL. + +"Transfer of Contribution Copyright" means that the Contributors of a +Contribution transfer the ownership and the copyright of the Contribution to +Open Source Modelica Consortium, the OpenModelica Copyright owner, for +inclusion in OpenModelica. The transfer takes place upon the effective date +when the Contribution is made available on the OSMC web site under OSMC-PL, by +such Contributors themselves or anyone acting on such Contributors' behalf. +The transfer is free of charge. If the Contributors or OSMC so wish, +an optional Copyright transfer agreement can be signed between OSMC and the +Contributors, as specified in an Appendix of the OSMC Bylaws. + +"Contribution License" means a license from OSMC to the Contributors of the +Contribution, effective on the date of the Transfer of Contribution Copyright, +where OSMC grants the Contributors a non-exclusive, world-wide, transferable, +free of charge, perpetual license, including sublicensing rights, to use, +have used, modify, have modified, reproduce and or have reproduced the +contributed material, for business and other purposes, including but not +limited to evaluation, development, testing, integration and merging with +other software and distribution. The warranty and liability disclaimers of +OSMC-PL apply to this license. + +"Contributor" means any person or entity that distributes (part of) +OpenModelica. + +"The Program" means the Contributions distributed in accordance with OSMC-PL. + +"OpenModelica" means the Contributions distributed in accordance with OSMC-PL. + +"Recipient" means anyone who receives OpenModelica under OSMC-PL, +including all Contributors. + +"Licensed Third Party Distributor" means a reseller/distributor having signed +a redistribution/resale agreement in accordance with OSMC-PL and OSMC Bylaws, +with an OSMC Level 2 organizational member which is not an Affiliate of the +reseller/distributor, for distributing a product containing part(s) of +OpenModelica. The Licensed Third Party Distributor shall only be allowed +further redistribution to other resellers if the Level 2 member is granting +such a right to it in the redistribution/resale agreement between the +Level 2 member and the Licensed Third Party Distributor. + +"Affiliate" shall mean any legal entity, directly or indirectly, through one +or more intermediaries, controlling or controlled by or under common control +with any other legal entity, as the case may be. For purposes of this +definition, the term "control" (including the terms "controlling", +"controlled by" and "under common control with") means the possession, +direct or indirect, of the power to direct or cause the direction of the +management and policies of a legal entity, whether through the ownership of +voting securities, by contract or otherwise. + +NO WARRANTY + +EXCEPT AS EXPRESSLY SET FORTH IN THE BY RECIPIENT SELECTED SUBSIDIARY +LICENSE CONDITIONS OF OSMC-PL, OPENMODELICA IS PROVIDED ON AN "AS IS" +BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR +IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF +TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR +PURPOSE. Each Recipient is solely responsible for determining the +appropriateness of using and distributing OPENMODELICA and assumes all risks +associated with its exercise of rights under OSMC-PL , including but not +limited to the risks and costs of program errors, compliance with applicable +laws, damage to or loss of data, programs or equipment, and unavailability +or interruption of operations. + +DISCLAIMER OF LIABILITY + +EXCEPT AS EXPRESSLY SET FORTH IN THE BY RECIPIENT SELECTED SUBSIDIARY +LICENSE CONDITIONS OF OSMC-PL, NEITHER RECIPIENT NOR ANY CONTRIBUTORS +SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION +LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF OPENMODELICA OR THE +EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + +A Contributor licensing OpenModelica under OSMC-Internal-EPL or +OSMC-External-EPL may choose to distribute (parts of) OpenModelica in object +code form under its own license agreement, provided that: + +a) it complies with the terms and conditions of OSMC-PL; or for the case of +redistribution of OpenModelica together with proprietary code it is a dual +license where the OpenModelica parts are distributed under OSMC-PL compatible +conditions and the proprietary code is distributed under proprietary license +conditions; and + +b) its license agreement: + i) effectively disclaims on behalf of all Contributors all warranties and +conditions, express and implied, including warranties or conditions of title +and non-infringement, and implied warranties or conditions of merchantability +and fitness for a particular purpose; + ii) effectively excludes on behalf of all Contributors all liability for +damages, including direct, indirect, special, incidental and consequential +damages, such as lost profits; + iii) states that any provisions which differ from OSMC-PL are offered by that +Contributor alone and not by any other party; and + iv) states from where the source code for OpenModelica is available, and +informs licensees how to obtain it in a reasonable manner on or through a +medium customarily used for software exchange. + +When OPENMODELICA is made available in source code form: + + a) it must be made available under OSMC-PL; and + + b) a copy of OSMC-PL must be included with each copy of OPENMODELICA. + + c) a copy of the subsidiary license associated with the selected mode of +OSMC-PL must be included with each copy of OPENMODELICA. + +Contributors may not remove or alter any copyright notices contained within +OPENMODELICA. + +If there is a conflict between OSMC-PL and the subsidiary license conditions, +OSMC-PL has priority. + +This Agreement is governed by the laws of Sweden. The place of jurisdiction +for all disagreements related to this Agreement, is Linköping, Sweden. + +The EPL 1.0 license definition has been obtained from: +http://www.eclipse.org/legal/epl-v10.html. It is also reproduced in Appendix B +of the OSMC Bylaws, and in the OpenModelica distribution. + +The AGPL Version 3 license definition has been obtained from +https://www.gnu.org/licenses/licenses.html#GPL. It is also reproduced in +Appendix C of the OSMC Bylaws, and in the OpenModelica distribution. + +--- End of Definition of OSMC Public License --- \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..dc533dc --- /dev/null +++ b/README.md @@ -0,0 +1,119 @@ +# MetaModelica Language Server + +[![Build](https://github.com/OpenModelica/metamodelica-language-server/actions/workflows/test.yml/badge.svg)](https://github.com/OpenModelica/metamodelica-language-server/actions/workflows/test.yml) + +A very early version of a MetaModelica Language Server based on +[OpenModelica/tree-sitter-metamodelica](https://github.com/OpenModelica/tree-sitter-metamodelica). + +For syntax highlighting install extension +[AnHeuermann.metamodelica](https://marketplace.visualstudio.com/items?itemName=AnHeuermann.metamodelica) +in addition. + +## Functionality + +This Language Server works for MetaModelica files. It has the following language +features: + + - Provide Outline of MetaModelica files. + + ![Outline](images/outline_demo.png) + +## Installation + +### Via Marketplace + +`OpenModelica.metamodelica-language-server` is not yet listed on the marketplace. + +### Via VSIX File + +Download the latest +[metamodelica-language-server-0.1.0.vsix](https://github.com/OpenModelica/metamodelica-language-server/releases/download/v0.1.0/metamodelica-language-server-0.1.0.vsix) +from the +[releases](https://github.com/OpenModelica/metamodelica-language-server/releases) +page. + +Check the [VS Code documentation](https://code.visualstudio.com/docs/editor/extension-marketplace#_install-from-a-vsix) +on how to install a .vsix file. +Use the `Install from VSIX` command or run + +```bash +code --install-extension metamodelica-language-server-0.1.0.vsix +``` + +## Contributing ❤️ + +Contributions are very welcome! + +We made the first tiny step but need help to add more features and refine the +language server. + +If you are searching for a good point to start +check the +[good first issue](https://github.com/OpenModelica/metamodelica-language-server/labels/good%20first%20issue). +To see where the development is heading to check the +[Projects section](https://github.com/OpenModelica/metamodelica-language-server/projects?query=is%3Aopen). +If you need more information start a discussion over at +[OpenModelica/OpenModelica](https://github.com/OpenModelica/OpenModelica). + +Found a bug or having issues? Open a +[new issue](https://github.com/OpenModelica/metamodelica-language-server/issues/new/choose). + +## Structure + +``` +. +├── client // Language Client +│ ├── src +│ │ ├── test // End to End tests for Language Client / Server +│ │ └── extension.ts // Language Client entry point +├── package.json // The extension manifest. +└── server // MetaModelica Language Server + └── src + └── server.ts // Language Server entry point +``` + +## Building the Language Server + + - Run `npm install` and `npm run postinstall` in this folder.This installs all + necessary npm modules in both the client and server folder + - Open VS Code on this folder. + - Press Ctrl+Shift+B to start compiling the client and server in [watch + mode](https://code.visualstudio.com/docs/editor/tasks#:~:text=The%20first%20entry%20executes,the%20HelloWorld.js%20file.). + - Switch to the Run and Debug View in the Sidebar (Ctrl+Shift+D). + - Select `Launch Client` from the drop down (if it is not already). + - Press ▷ to run the launch config (F5). + - In the [Extension Development + Host](https://code.visualstudio.com/api/get-started/your-first-extension#:~:text=Then%2C%20inside%20the%20editor%2C%20press%20F5.%20This%20will%20compile%20and%20run%20the%20extension%20in%20a%20new%20Extension%20Development%20Host%20window.) + instance of VSCode, open a document in 'metamodelica' language mode. + - Check the console output of `Language Server MetaModelica` to see the parsed + tree of the opened file. + +## Build and Install Extension + +``` +npx vsce package +``` + +## License + +metamodelica-language-server is licensed under the OSMC Public License v1.8, see +[OSMC-License.txt](./OSMC-License.txt). + +### 3rd Party Licenses + +This extension is based on +[https://github.com/microsoft/vscode-extension-samples/tree/main/lsp-sample](https://github.com/microsoft/vscode-extension-samples/tree/main/lsp-sample), +licensed under MIT license. + +Some parts of the source code are taken from +[bash-lsp/bash-language-server](https://github.com/bash-lsp/bash-language-server), +licensed under the MIT license and adapted to the MetaModelica language server. + +[OpenModelica/tree-sitter-metamodelica](https://github.com/OpenModelica/tree-sitter-metamodelica) +v0.2.0 is included in this extension and is licensed under the [OSMC-PL +v1.8](./server/OSMC-License.txt). + +## Acknowledgments + +This package was initially developed by +[Hochschule Bielefeld - University of Applied Sciences and Arts](hsbi.de). diff --git a/client/package-lock.json b/client/package-lock.json new file mode 100644 index 0000000..1ab30cd --- /dev/null +++ b/client/package-lock.json @@ -0,0 +1,304 @@ +{ + "name": "metamodelica-language-server-client", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "metamodelica-language-server-client", + "version": "0.1.0", + "license": "OSMC-PL-1-8", + "dependencies": { + "vscode-languageclient": "^8.1.0" + }, + "devDependencies": { + "@types/vscode": "^1.75.1", + "@vscode/test-electron": "^2.3.8" + }, + "engines": { + "node": "20", + "vscode": "^1.75.0" + } + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@types/vscode": { + "version": "1.84.2", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.84.2.tgz", + "integrity": "sha512-LCe1FvCDMJKkPdLVGYhP0HRJ1PDop2gRVm/zFHiOKwYLBRS7vEV3uOOUId4HMV+L1IxqyS+IZXMmlSMRbZGIAw==", + "dev": true + }, + "node_modules/@vscode/test-electron": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.3.8.tgz", + "integrity": "sha512-b4aZZsBKtMGdDljAsOPObnAi7+VWIaYl3ylCz1jTs+oV6BZ4TNHcVNC3xUn0azPeszBmwSBDQYfFESIaUQnrOg==", + "dev": true, + "dependencies": { + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "jszip": "^3.10.1", + "semver": "^7.5.2" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "dev": true + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "dev": true, + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/vscode-jsonrpc": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.1.0.tgz", + "integrity": "sha512-6TDy/abTQk+zDGYazgbIPc+4JoXdwC8NHU9Pbn4UJP1fehUyZmM4RHp5IthX7A6L5KS30PRui+j+tbbMMMafdw==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/vscode-languageclient": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-8.1.0.tgz", + "integrity": "sha512-GL4QdbYUF/XxQlAsvYWZRV3V34kOkpRlvV60/72ghHfsYFnS/v2MANZ9P6sHmxFcZKOse8O+L9G7Czg0NUWing==", + "dependencies": { + "minimatch": "^5.1.0", + "semver": "^7.3.7", + "vscode-languageserver-protocol": "3.17.3" + }, + "engines": { + "vscode": "^1.67.0" + } + }, + "node_modules/vscode-languageserver-protocol": { + "version": "3.17.3", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.3.tgz", + "integrity": "sha512-924/h0AqsMtA5yK22GgMtCYiMdCOtWTSGgUOkgEDX+wk2b0x4sAfLiO4NxBxqbiVtz7K7/1/RgVrVI0NClZwqA==", + "dependencies": { + "vscode-jsonrpc": "8.1.0", + "vscode-languageserver-types": "3.17.3" + } + }, + "node_modules/vscode-languageserver-types": { + "version": "3.17.3", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.3.tgz", + "integrity": "sha512-SYU4z1dL0PyIMd4Vj8YOqFvHu7Hz/enbWtpfnVbJHU4Nd1YNYx8u0ennumc6h48GQNeOLxmwySmnADouT/AuZA==" + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } +} diff --git a/client/package.json b/client/package.json new file mode 100644 index 0000000..ae8682c --- /dev/null +++ b/client/package.json @@ -0,0 +1,23 @@ +{ + "name": "metamodelica-language-server-client", + "description": "VSCode part of a language server", + "author": "Andreas Heuermann", + "license": "OSMC-PL-1-8", + "version": "0.1.0", + "publisher": "vscode", + "repository": { + "type": "git", + "url": "https://github.com/OpenModelica/metamodelica-language-server" + }, + "engines": { + "vscode": "^1.75.0", + "node": "20" + }, + "dependencies": { + "vscode-languageclient": "^8.1.0" + }, + "devDependencies": { + "@types/vscode": "^1.75.1", + "@vscode/test-electron": "^2.3.8" + } +} diff --git a/client/src/extension.ts b/client/src/extension.ts new file mode 100644 index 0000000..47a673b --- /dev/null +++ b/client/src/extension.ts @@ -0,0 +1,125 @@ +/* + * This file is part of OpenModelica. + * + * Copyright (c) 1998-2024, Open Source Modelica Consortium (OSMC), + * c/o Linköpings universitet, Department of Computer and Information Science, + * SE-58183 Linköping, Sweden. + * + * All rights reserved. + * + * THIS PROGRAM IS PROVIDED UNDER THE TERMS OF AGPL VERSION 3 LICENSE OR + * THIS OSMC PUBLIC LICENSE (OSMC-PL) VERSION 1.8. + * ANY USE, REPRODUCTION OR DISTRIBUTION OF THIS PROGRAM CONSTITUTES + * RECIPIENT'S ACCEPTANCE OF THE OSMC PUBLIC LICENSE OR THE GNU AGPL + * VERSION 3, ACCORDING TO RECIPIENTS CHOICE. + * + * The OpenModelica software and the OSMC (Open Source Modelica Consortium) + * Public License (OSMC-PL) are obtained from OSMC, either from the above + * address, from the URLs: + * http://www.openmodelica.org or + * https://github.com/OpenModelica/ or + * http://www.ida.liu.se/projects/OpenModelica, + * and in the OpenModelica distribution. + * + * GNU AGPL version 3 is obtained from: + * https://www.gnu.org/licenses/licenses.html#GPL + * + * This program is distributed WITHOUT ANY WARRANTY; without + * even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE, EXCEPT AS EXPRESSLY SET FORTH + * IN THE BY RECIPIENT SELECTED SUBSIDIARY LICENSE CONDITIONS OF OSMC-PL. + * + * See the full OSMC Public License conditions for more details. + * + */ + +import * as path from 'path'; +import * as fs from 'fs'; +import { languages, workspace, ExtensionContext, TextDocument } from 'vscode'; +import { + LanguageClient, + LanguageClientOptions, + ServerOptions, + TransportKind +} from 'vscode-languageclient/node'; +import { getFileExtension, getLanguage } from './getLanguage'; +import { fstat } from 'fs'; + +let client: LanguageClient; + +export function activate(context: ExtensionContext) { + // Register event listener to set language for '.mo' files. + const checkedFiles: { [id: string]: boolean} = {}; + workspace.onDidOpenTextDocument((document: TextDocument) => { + if (checkedFiles[document.fileName]) { + return; + } + + checkedFiles[document.fileName] = true; + if (getFileExtension(document) == '.mo') { + const lang = getLanguage(document); + + switch (lang) { + case 'modelica': + languages.setTextDocumentLanguage(document, 'modelica'); + break; + case 'metamodelica': + languages.setTextDocumentLanguage(document, 'metamodelica'); + break; + default: + break; + } + } + }); + + // The server is implemented in node, point to packed module + const serverModule = context.asAbsolutePath( + path.join('out', 'server.js') + ); + if (!fs.existsSync(serverModule)) { + throw new Error(`Can't find server module in ${serverModule}`); + } + + // If the extension is launched in debug mode then the debug server options are used + // Otherwise the run options are used + const serverOptions: ServerOptions = { + run: { module: serverModule, transport: TransportKind.ipc }, + debug: { + module: serverModule, + transport: TransportKind.ipc, + } + }; + + // Options to control the language client + const clientOptions: LanguageClientOptions = { + // Register the server for metamodelica text documents + documentSelector: [ + { + language: 'metamodelica', + scheme: 'file' + } + ], + synchronize: { + // Notify the server about file changes to '.clientrc files contained in the workspace + fileEvents: workspace.createFileSystemWatcher('**/.clientrc') + } + }; + + // Create the language client and start the client. + client = new LanguageClient( + 'metamodelicaLanguageServer', + 'MetaModelica Language Server', + serverOptions, + clientOptions + ); + + // Start the client. This will also launch the server + client.start(); +} + +export function deactivate(): Thenable | undefined { + if (!client) { + return undefined; + } + return client.stop(); +} diff --git a/client/src/getLanguage.ts b/client/src/getLanguage.ts new file mode 100644 index 0000000..777e95a --- /dev/null +++ b/client/src/getLanguage.ts @@ -0,0 +1,64 @@ +/* + * This file is part of OpenModelica. + * + * Copyright (c) 1998-2024, Open Source Modelica Consortium (OSMC), + * c/o Linköpings universitet, Department of Computer and Information Science, + * SE-58183 Linköping, Sweden. + * + * All rights reserved. + * + * THIS PROGRAM IS PROVIDED UNDER THE TERMS OF AGPL VERSION 3 LICENSE OR + * THIS OSMC PUBLIC LICENSE (OSMC-PL) VERSION 1.8. + * ANY USE, REPRODUCTION OR DISTRIBUTION OF THIS PROGRAM CONSTITUTES + * RECIPIENT'S ACCEPTANCE OF THE OSMC PUBLIC LICENSE OR THE GNU AGPL + * VERSION 3, ACCORDING TO RECIPIENTS CHOICE. + * + * The OpenModelica software and the OSMC (Open Source Modelica Consortium) + * Public License (OSMC-PL) are obtained from OSMC, either from the above + * address, from the URLs: + * http://www.openmodelica.org or + * https://github.com/OpenModelica/ or + * http://www.ida.liu.se/projects/OpenModelica, + * and in the OpenModelica distribution. + * + * GNU AGPL version 3 is obtained from: + * https://www.gnu.org/licenses/licenses.html#GPL + * + * This program is distributed WITHOUT ANY WARRANTY; without + * even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE, EXCEPT AS EXPRESSLY SET FORTH + * IN THE BY RECIPIENT SELECTED SUBSIDIARY LICENSE CONDITIONS OF OSMC-PL. + * + * See the full OSMC Public License conditions for more details. + * + */ + +import * as path from 'path'; +import { TextDocument } from 'vscode'; + +type LanguageTypes = 'modelica' | 'metamodelica' | 'unknown' + +export function getFileExtension(document: TextDocument): string | undefined { + const uri = document.uri; + const filePath = uri.fsPath; + return path.extname(filePath); +} + +function hasMetaModelicaKeywords(content: string): boolean { + const unionRegex = new RegExp('\\b(uniontype)\\s+(\\w+)\\s*(".*")*'); + + return unionRegex.test(content); +} + +/** + * Check if the text document is a Modelica files, MetaModelica file or other. + * @param document Text document. + */ +export function getLanguage(document: TextDocument): LanguageTypes { + // Check + if (hasMetaModelicaKeywords(document.getText())) { + return 'metamodelica'; + } + + return 'modelica'; +} diff --git a/client/src/test/helper.ts b/client/src/test/helper.ts new file mode 100644 index 0000000..575f8cd --- /dev/null +++ b/client/src/test/helper.ts @@ -0,0 +1,70 @@ +/* + * This file is part of OpenModelica. + * + * Copyright (c) 1998-2024, Open Source Modelica Consortium (OSMC), + * c/o Linköpings universitet, Department of Computer and Information Science, + * SE-58183 Linköping, Sweden. + * + * All rights reserved. + * + * THIS PROGRAM IS PROVIDED UNDER THE TERMS OF AGPL VERSION 3 LICENSE OR + * THIS OSMC PUBLIC LICENSE (OSMC-PL) VERSION 1.8. + * ANY USE, REPRODUCTION OR DISTRIBUTION OF THIS PROGRAM CONSTITUTES + * RECIPIENT'S ACCEPTANCE OF THE OSMC PUBLIC LICENSE OR THE GNU AGPL + * VERSION 3, ACCORDING TO RECIPIENTS CHOICE. + * + * The OpenModelica software and the OSMC (Open Source Modelica Consortium) + * Public License (OSMC-PL) are obtained from OSMC, either from the above + * address, from the URLs: + * http://www.openmodelica.org or + * https://github.com/OpenModelica/ or + * http://www.ida.liu.se/projects/OpenModelica, + * and in the OpenModelica distribution. + * + * GNU AGPL version 3 is obtained from: + * https://www.gnu.org/licenses/licenses.html#GPL + * + * This program is distributed WITHOUT ANY WARRANTY; without + * even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE, EXCEPT AS EXPRESSLY SET FORTH + * IN THE BY RECIPIENT SELECTED SUBSIDIARY LICENSE CONDITIONS OF OSMC-PL. + * + * See the full OSMC Public License conditions for more details. + * + */ + +import * as vscode from 'vscode'; +import * as path from 'path'; + +export let doc: vscode.TextDocument; +export let editor: vscode.TextEditor; +export let documentEol: string; +export let platformEol: string; + +/** + * Activates the OpenModelica.metamodelica-language-server extension + */ +export async function activate(docUri: vscode.Uri) { + // The extensionId is `publisher.name` from package.json + const ext = vscode.extensions.getExtension('OpenModelica.metamodelica-language-server')!; + await ext.activate(); + try { + doc = await vscode.workspace.openTextDocument(docUri); + editor = await vscode.window.showTextDocument(doc); + await sleep(5000); // Wait for server activation + } catch (e) { + console.error(e); + } +} + +async function sleep(ms: number) { + return new Promise(resolve => setTimeout(resolve, ms)); +} + +export const getDocPath = (p: string) => { + return path.resolve(__dirname, '../../testFixture', p); +}; + +export const getDocUri = (p: string) => { + return vscode.Uri.file(getDocPath(p)); +}; diff --git a/client/src/test/index.ts b/client/src/test/index.ts new file mode 100644 index 0000000..5e09ff6 --- /dev/null +++ b/client/src/test/index.ts @@ -0,0 +1,74 @@ +/* + * This file is part of OpenModelica. + * + * Copyright (c) 1998-2024, Open Source Modelica Consortium (OSMC), + * c/o Linköpings universitet, Department of Computer and Information Science, + * SE-58183 Linköping, Sweden. + * + * All rights reserved. + * + * THIS PROGRAM IS PROVIDED UNDER THE TERMS OF AGPL VERSION 3 LICENSE OR + * THIS OSMC PUBLIC LICENSE (OSMC-PL) VERSION 1.8. + * ANY USE, REPRODUCTION OR DISTRIBUTION OF THIS PROGRAM CONSTITUTES + * RECIPIENT'S ACCEPTANCE OF THE OSMC PUBLIC LICENSE OR THE GNU AGPL + * VERSION 3, ACCORDING TO RECIPIENTS CHOICE. + * + * The OpenModelica software and the OSMC (Open Source Modelica Consortium) + * Public License (OSMC-PL) are obtained from OSMC, either from the above + * address, from the URLs: + * http://www.openmodelica.org or + * https://github.com/OpenModelica/ or + * http://www.ida.liu.se/projects/OpenModelica, + * and in the OpenModelica distribution. + * + * GNU AGPL version 3 is obtained from: + * https://www.gnu.org/licenses/licenses.html#GPL + * + * This program is distributed WITHOUT ANY WARRANTY; without + * even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE, EXCEPT AS EXPRESSLY SET FORTH + * IN THE BY RECIPIENT SELECTED SUBSIDIARY LICENSE CONDITIONS OF OSMC-PL. + * + * See the full OSMC Public License conditions for more details. + * + */ + +import * as path from 'path'; +import * as Mocha from 'mocha'; +import * as glob from 'glob'; + +export function run(): Promise { + // Create the mocha test + const mocha = new Mocha({ + ui: 'tdd', + color: true + }); + mocha.timeout(100000); + + const testsRoot = __dirname; + + return new Promise((resolve, reject) => { + glob('**.test.js', { cwd: testsRoot }, (err, files) => { + if (err) { + return reject(err); + } + + // Add files to the test suite + files.forEach(f => mocha.addFile(path.resolve(testsRoot, f))); + + try { + // Run the mocha test + mocha.run(failures => { + if (failures > 0) { + reject(new Error(`${failures} tests failed.`)); + } else { + resolve(); + } + }); + } catch (err) { + console.error(err); + reject(err); + } + }); + }); +} \ No newline at end of file diff --git a/client/src/test/runTest.ts b/client/src/test/runTest.ts new file mode 100644 index 0000000..4eebbac --- /dev/null +++ b/client/src/test/runTest.ts @@ -0,0 +1,58 @@ +/* + * This file is part of OpenModelica. + * + * Copyright (c) 1998-2024, Open Source Modelica Consortium (OSMC), + * c/o Linköpings universitet, Department of Computer and Information Science, + * SE-58183 Linköping, Sweden. + * + * All rights reserved. + * + * THIS PROGRAM IS PROVIDED UNDER THE TERMS OF AGPL VERSION 3 LICENSE OR + * THIS OSMC PUBLIC LICENSE (OSMC-PL) VERSION 1.8. + * ANY USE, REPRODUCTION OR DISTRIBUTION OF THIS PROGRAM CONSTITUTES + * RECIPIENT'S ACCEPTANCE OF THE OSMC PUBLIC LICENSE OR THE GNU AGPL + * VERSION 3, ACCORDING TO RECIPIENTS CHOICE. + * + * The OpenModelica software and the OSMC (Open Source Modelica Consortium) + * Public License (OSMC-PL) are obtained from OSMC, either from the above + * address, from the URLs: + * http://www.openmodelica.org or + * https://github.com/OpenModelica/ or + * http://www.ida.liu.se/projects/OpenModelica, + * and in the OpenModelica distribution. + * + * GNU AGPL version 3 is obtained from: + * https://www.gnu.org/licenses/licenses.html#GPL + * + * This program is distributed WITHOUT ANY WARRANTY; without + * even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE, EXCEPT AS EXPRESSLY SET FORTH + * IN THE BY RECIPIENT SELECTED SUBSIDIARY LICENSE CONDITIONS OF OSMC-PL. + * + * See the full OSMC Public License conditions for more details. + * + */ + +import * as path from 'path'; + +import { runTests } from '@vscode/test-electron'; + +async function main() { + try { + // The folder containing the Extension Manifest package.json + // Passed to `--extensionDevelopmentPath` + const extensionDevelopmentPath = path.resolve(__dirname, '../../../'); + + // The path to test runner + // Passed to --extensionTestsPath + const extensionTestsPath = path.resolve(__dirname, './index'); + + // Download VS Code, unzip it and run the integration test + await runTests({ extensionDevelopmentPath, extensionTestsPath }); + } catch (err) { + console.error('Failed to run tests'); + process.exit(1); + } +} + +main(); diff --git a/client/src/test/symbolinformation.test.ts b/client/src/test/symbolinformation.test.ts new file mode 100644 index 0000000..97d71bc --- /dev/null +++ b/client/src/test/symbolinformation.test.ts @@ -0,0 +1,131 @@ +/* + * This file is part of OpenModelica. + * + * Copyright (c) 1998-2024, Open Source Modelica Consortium (OSMC), + * c/o Linköpings universitet, Department of Computer and Information Science, + * SE-58183 Linköping, Sweden. + * + * All rights reserved. + * + * THIS PROGRAM IS PROVIDED UNDER THE TERMS OF AGPL VERSION 3 LICENSE OR + * THIS OSMC PUBLIC LICENSE (OSMC-PL) VERSION 1.8. + * ANY USE, REPRODUCTION OR DISTRIBUTION OF THIS PROGRAM CONSTITUTES + * RECIPIENT'S ACCEPTANCE OF THE OSMC PUBLIC LICENSE OR THE GNU AGPL + * VERSION 3, ACCORDING TO RECIPIENTS CHOICE. + * + * The OpenModelica software and the OSMC (Open Source Modelica Consortium) + * Public License (OSMC-PL) are obtained from OSMC, either from the above + * address, from the URLs: + * http://www.openmodelica.org or + * https://github.com/OpenModelica/ or + * http://www.ida.liu.se/projects/OpenModelica, + * and in the OpenModelica distribution. + * + * GNU AGPL version 3 is obtained from: + * https://www.gnu.org/licenses/licenses.html#GPL + * + * This program is distributed WITHOUT ANY WARRANTY; without + * even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE, EXCEPT AS EXPRESSLY SET FORTH + * IN THE BY RECIPIENT SELECTED SUBSIDIARY LICENSE CONDITIONS OF OSMC-PL. + * + * See the full OSMC Public License conditions for more details. + * + */ + +import * as vscode from 'vscode'; +import * as assert from 'assert'; +import { getDocUri, activate } from './helper'; + +suite('Symbol Information', () => { + const docUri = getDocUri('MyLibrary.mo'); + + test('onDocumentSymbol()', async () => { + const documentSymbols: vscode.DocumentSymbol[] = [ + new vscode.DocumentSymbol( + 'MyLibrary', + '', + vscode.SymbolKind.Package, + new vscode.Range(new vscode.Position(0, 0), new vscode.Position(6, 13)), + new vscode.Range(new vscode.Position(0, 0), new vscode.Position(6, 13)), + ) + ]; + documentSymbols[0].children.push( + new vscode.DocumentSymbol( + 'M', + '', + vscode.SymbolKind.Class, + new vscode.Range(new vscode.Position(1, 2), new vscode.Position(5, 7)), + new vscode.Range(new vscode.Position(1, 2), new vscode.Position(5, 7)) + )); + + await testSymbolInformation(docUri, documentSymbols); + }); +}); + +async function testSymbolInformation( + docUri: vscode.Uri, + expectedDocumentSymbols: vscode.DocumentSymbol[] +) { + await activate(docUri); + + // Execute `vscode.executeDocumentSymbolProvider` to get file outline + const actualSymbolInformation = await vscode.commands.executeCommand("vscode.executeDocumentSymbolProvider", docUri); + + //printDocumentSymbols(actualSymbolInformation); + assertDocumentSymbolsEqual(expectedDocumentSymbols, actualSymbolInformation); +} + +function printDocumentSymbols(documentSymbols: vscode.DocumentSymbol[]) { + documentSymbols.forEach((symbol, index) => { + console.log(`Document Symbol ${index + 1}:`); + console.log(`Name: ${symbol.name}`); + console.log(`Kind: ${vscode.SymbolKind[symbol.kind]}`); + console.log(`Range: ${symbol.range.start.line}:${symbol.range.start.character}, ${symbol.range.end.line}:${symbol.range.end.character}`); + console.log(`SelectionRange: ${symbol.selectionRange.start.line}:${symbol.selectionRange.start.character}, ${symbol.selectionRange.end.line}:${symbol.selectionRange.end.character}`); + console.log('Children:'); + + if (symbol.children && symbol.children.length > 0) { + printDocumentSymbols(symbol.children); + } + + console.log('---'); + }); +} + +function assertDocumentSymbolsEqual(expected: vscode.DocumentSymbol[], actual: vscode.DocumentSymbol[]) { + assert.strictEqual(expected.length, actual.length, 'Array lengths do not match.'); + + for (let i = 0; i < expected.length; i++) { + const expectedSymbol = expected[i]; + const actualSymbol = actual[i]; + + assert.strictEqual(expectedSymbol.name, actualSymbol.name, `Symbol names do not match at index ${i}.`); + assert.strictEqual(expectedSymbol.kind, actualSymbol.kind, `Symbol kinds do not match at index ${i}.`); + + assert.strictEqual( + expectedSymbol.range.start.line, + actualSymbol.range.start.line, + `Symbol start line does not match at index ${i}.` + ); + assert.strictEqual( + expectedSymbol.range.start.character, + actualSymbol.range.start.character, + `Symbol start character does not match at index ${i}.` + ); + + assert.strictEqual( + expectedSymbol.range.end.line, + actualSymbol.range.end.line, + `Symbol end line does not match at index ${i}.` + ); + assert.strictEqual( + expectedSymbol.range.end.character, + actualSymbol.range.end.character, + `Symbol end character does not match at index ${i}.` + ); + + // Recursive check for children symbols + assertDocumentSymbolsEqual(expectedSymbol.children || [], actualSymbol.children || []); + } +} diff --git a/client/testFixture/MyLibrary.mo b/client/testFixture/MyLibrary.mo new file mode 100644 index 0000000..da94761 --- /dev/null +++ b/client/testFixture/MyLibrary.mo @@ -0,0 +1,7 @@ +package MyLibrary "My Modelica Library" + model M "MWE Modelica Model" + Real x(start = 1.0, fixed = true); + equation + der(x) = -0.5*x; + end M; +end MyLibrary; diff --git a/client/tsconfig.json b/client/tsconfig.json new file mode 100644 index 0000000..dec5f77 --- /dev/null +++ b/client/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "module": "commonjs", + "target": "es2020", + "lib": [ + "es2020" + ], + "outDir": "out", + "rootDir": "src", + "sourceMap": true + }, + "include": [ + "src", + "src/test" + ], + "exclude": [ + "node_modules", + ".vscode-test" + ] +} \ No newline at end of file diff --git a/esbuild.config.js b/esbuild.config.js new file mode 100644 index 0000000..db0f37f --- /dev/null +++ b/esbuild.config.js @@ -0,0 +1,39 @@ +const esbuild = require('esbuild'); +const fs = require('fs'); + +// Build client +esbuild.build({ + entryPoints: [ + './client/src/extension.ts' + ], + bundle: true, + outfile: './out/client.js', + platform: 'node', + external: [ + 'vscode' + ], + format: 'cjs', + tsconfig: './client/tsconfig.json', +}).catch(() => process.exit(1)); + +// Build server +esbuild.build({ + entryPoints: [ + './server/src/server.ts' + ], + bundle: true, + outfile: './out/server.js', + platform: 'node', + external: [ + 'vscode', + ], + format: 'cjs', + tsconfig: './server/tsconfig.json', +}).catch(() => process.exit(1)); + +// Copy tree-sitter.wasm and tree-sitter-metamodelica.wasm to the output directory +if (!fs.existsSync('out')) { + fs.mkdirSync('out'); +} +fs.copyFileSync('./server/src/tree-sitter-metamodelica.wasm', './out/tree-sitter-metamodelica.wasm'); +fs.copyFileSync('./server/node_modules/web-tree-sitter/tree-sitter.wasm', './out/tree-sitter.wasm'); diff --git a/images/Modelica_Language_marging.jpg b/images/Modelica_Language_marging.jpg new file mode 100644 index 0000000000000000000000000000000000000000..20ab50e6292d28c79caf08999c7c5cf1d9e028ac GIT binary patch literal 43709 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 literal 0 HcmV?d00001 diff --git a/images/outline_demo.png b/images/outline_demo.png new file mode 100644 index 0000000000000000000000000000000000000000..871debb65d493d4c30b5db3d571d6f446d19a728 GIT binary patch literal 250420 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

Wbob?@0chzm#p#aIi-%+Poo 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 GmaAz=VFhl%_naqE=S-9bh5$Q8P; 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.10.0" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", + "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", + "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", + "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", + "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", + "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", + "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", + "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", + "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", + "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", + "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", + "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", + "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", + "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", + "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", + "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", + "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", + "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", + "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", + "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", + "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", + "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", + "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", + "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "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": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "dev": true + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "node_modules/@types/mocha": { + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.6.tgz", + "integrity": "sha512-dJvrYWxP/UcXm36Qn36fxhUKu8A/xMRXVT2cliFF1Z7UA9liG5Psj3ezNSZw+5puH2czDXRLcXQxf8JbJt0ejg==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.12.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz", + "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/semver": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", + "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/type-utils": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", + "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", + "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", + "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", + "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", + "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", + "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", + "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.20.2", + "@esbuild/android-arm": "0.20.2", + "@esbuild/android-arm64": "0.20.2", + "@esbuild/android-x64": "0.20.2", + "@esbuild/darwin-arm64": "0.20.2", + "@esbuild/darwin-x64": "0.20.2", + "@esbuild/freebsd-arm64": "0.20.2", + "@esbuild/freebsd-x64": "0.20.2", + "@esbuild/linux-arm": "0.20.2", + "@esbuild/linux-arm64": "0.20.2", + "@esbuild/linux-ia32": "0.20.2", + "@esbuild/linux-loong64": "0.20.2", + "@esbuild/linux-mips64el": "0.20.2", + "@esbuild/linux-ppc64": "0.20.2", + "@esbuild/linux-riscv64": "0.20.2", + "@esbuild/linux-s390x": "0.20.2", + "@esbuild/linux-x64": "0.20.2", + "@esbuild/netbsd-x64": "0.20.2", + "@esbuild/openbsd-x64": "0.20.2", + "@esbuild/sunos-x64": "0.20.2", + "@esbuild/win32-arm64": "0.20.2", + "@esbuild/win32-ia32": "0.20.2", + "@esbuild/win32-x64": "0.20.2" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "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": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "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": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mocha": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.4.0.tgz", + "integrity": "sha512-eqhGB8JKapEYcC4ytX/xrzKforgEc3j1pGlAXVy3eRwrtAy5/nIfT1SvgGzfN0XZZxeLq0aQWkOUAmqIJiv+bA==", + "dev": true, + "dependencies": { + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.4", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "8.1.0", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "5.0.1", + "ms": "2.1.3", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "workerpool": "6.2.1", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/mocha/node_modules/minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "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": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "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": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "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/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node/node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/workerpool": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "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" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..c344e1e --- /dev/null +++ b/package.json @@ -0,0 +1,69 @@ +{ + "name": "metamodelica-language-server", + "displayName": "MetaModelica Language Server", + "description": "[Experimental] MetaModelica language server", + "version": "0.1.0", + "author": "Andreas Heuermann", + "license": "OSMC-PL-1-8", + "repository": { + "type": "git", + "url": "https://github.com/OpenModelica/metamodelica-language-server" + }, + "publisher": "OpenModelica", + "categories": [ + "Programming Languages" + ], + "keywords": [ + "modelica", + "metamodelica", + "language", + "language-server" + ], + "homepage": "https://github.com/OpenModelica/metamodelica-language-server", + "icon": "images/Modelica_Language_marging.jpg", + "bugs": "https://github.com/OpenModelica/metamodelica-language-server/issues", + "engines": { + "vscode": "^1.75.0" + }, + "activationEvents": [ + "onLanguage:metamodelica" + ], + "main": "./out/client", + "contributes": { + "languages": [ + { + "id": "metamodelica", + "aliases": [ + "MetaModelica", + "metamodelica" + ], + "extensions": [ + ".mo" + ] + } + ] + }, + "scripts": { + "vscode:prepublish": "npm run esbuild-base -- --minify", + "esbuild-base": "node esbuild.config.js", + "esbuild": "npm run esbuild-base -- --sourcemap", + "esbuild-watch": "npm run esbuild-base -- --sourcemap --watch", + "test-compile": "tsc -b ./", + "lint": "eslint ./client/src ./server/src --ext .ts,.tsx", + "postinstall": "cd client && npm install && cd ../server && npm install && cd ..", + "test": "npm run test-compile && sh ./scripts/e2e.sh", + "test:server": "cd server && npx mocha -r ts-node/register src/test/**/*.test.ts src/util/test/**/*.test.ts", + "all": "npm run postinstall && npm run esbuild && npm run lint && npm run test:server && npm run test && npm run vscode:prepublish" + }, + "devDependencies": { + "@types/mocha": "^10.0.6", + "@types/node": "^20.10.4", + "@typescript-eslint/eslint-plugin": "^6.13.2", + "@typescript-eslint/parser": "^6.13.2", + "esbuild": "^0.20.0", + "eslint": "^8.55.0", + "mocha": "^10.2.0", + "ts-node": "^10.9.1", + "typescript": "^5.3.3" + } +} diff --git a/scripts/e2e.sh b/scripts/e2e.sh new file mode 100644 index 0000000..2a4ff73 --- /dev/null +++ b/scripts/e2e.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env bash + +export CODE_TESTS_PATH="$(pwd)/client/out/test" +export CODE_TESTS_WORKSPACE="$(pwd)/client/testFixture" + +node "$(pwd)/client/out/test/runTest" diff --git a/server/package-lock.json b/server/package-lock.json new file mode 100644 index 0000000..d32f49d --- /dev/null +++ b/server/package-lock.json @@ -0,0 +1,486 @@ +{ + "name": "metamodelica-language-server-server", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "metamodelica-language-server-server", + "version": "0.1.0", + "license": "OSMC-PL-1-8", + "dependencies": { + "tree-sitter": "^0.20.6", + "vscode-languageserver": "^9.0.1", + "vscode-languageserver-textdocument": "^1.0.11", + "web-tree-sitter": "^0.20.8" + }, + "engines": { + "node": "20" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + }, + "node_modules/nan": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.19.0.tgz", + "integrity": "sha512-nO1xXxfh/RWNxfd/XPfbIfFk5vgLsAxUR9y5O0cHMJu/AW9U95JLXqthYHjEp+8gQ5p96K9jUp8nbVOxCdRbtw==" + }, + "node_modules/napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" + }, + "node_modules/node-abi": { + "version": "3.58.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.58.0.tgz", + "integrity": "sha512-pXY1jnGf5T7b8UNzWzIqf0EkX4bx/w8N2AvwlGnk2SYYA/kzDVPaH0Dh0UG4EwxBB5eKOIZKPr8VAHSHL1DPGg==", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/prebuild-install": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", + "integrity": "sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==", + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tree-sitter": { + "version": "0.20.6", + "resolved": "https://registry.npmjs.org/tree-sitter/-/tree-sitter-0.20.6.tgz", + "integrity": "sha512-GxJodajVpfgb3UREzzIbtA1hyRnTxVbWVXrbC6sk4xTMH5ERMBJk9HJNq4c8jOJeUaIOmLcwg+t6mez/PDvGqg==", + "hasInstallScript": true, + "dependencies": { + "nan": "^2.18.0", + "prebuild-install": "^7.1.1" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/vscode-jsonrpc": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", + "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/vscode-languageserver": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz", + "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==", + "dependencies": { + "vscode-languageserver-protocol": "3.17.5" + }, + "bin": { + "installServerIntoExtension": "bin/installServerIntoExtension" + } + }, + "node_modules/vscode-languageserver-protocol": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", + "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", + "dependencies": { + "vscode-jsonrpc": "8.2.0", + "vscode-languageserver-types": "3.17.5" + } + }, + "node_modules/vscode-languageserver-textdocument": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.11.tgz", + "integrity": "sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==" + }, + "node_modules/vscode-languageserver-types": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==" + }, + "node_modules/web-tree-sitter": { + "version": "0.20.8", + "resolved": "https://registry.npmjs.org/web-tree-sitter/-/web-tree-sitter-0.20.8.tgz", + "integrity": "sha512-weOVgZ3aAARgdnb220GqYuh7+rZU0Ka9k9yfKtGAzEYMa6GgiCzW9JjQRJyCJakvibQW+dfjJdihjInKuuCAUQ==" + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } +} diff --git a/server/package.json b/server/package.json new file mode 100644 index 0000000..8dddee5 --- /dev/null +++ b/server/package.json @@ -0,0 +1,22 @@ +{ + "name": "metamodelica-language-server-server", + "displayName": "MetaModelica Language Server", + "description": "[Experimental] MetaModelica language server.", + "version": "0.1.0", + "author": "Andreas Heuermann, Osman Karabel", + "license": "OSMC-PL-1-8", + "engines": { + "node": "20" + }, + "repository": { + "type": "git", + "url": "https://github.com/OpenModelica/metamodelica-language-server" + }, + "dependencies": { + "tree-sitter": "^0.20.6", + "vscode-languageserver": "^9.0.1", + "vscode-languageserver-textdocument": "^1.0.11", + "web-tree-sitter": "^0.20.8" + }, + "scripts": {} +} diff --git a/server/src/analyzer.ts b/server/src/analyzer.ts new file mode 100644 index 0000000..e8096a2 --- /dev/null +++ b/server/src/analyzer.ts @@ -0,0 +1,103 @@ +/* + * This file is part of OpenModelica. + * + * Copyright (c) 1998-2024, Open Source Modelica Consortium (OSMC), + * c/o Linköpings universitet, Department of Computer and Information Science, + * SE-58183 Linköping, Sweden. + * + * All rights reserved. + * + * THIS PROGRAM IS PROVIDED UNDER THE TERMS OF AGPL VERSION 3 LICENSE OR + * THIS OSMC PUBLIC LICENSE (OSMC-PL) VERSION 1.8. + * ANY USE, REPRODUCTION OR DISTRIBUTION OF THIS PROGRAM CONSTITUTES + * RECIPIENT'S ACCEPTANCE OF THE OSMC PUBLIC LICENSE OR THE GNU AGPL + * VERSION 3, ACCORDING TO RECIPIENTS CHOICE. + * + * The OpenModelica software and the OSMC (Open Source Modelica Consortium) + * Public License (OSMC-PL) are obtained from OSMC, either from the above + * address, from the URLs: + * http://www.openmodelica.org or + * https://github.com/OpenModelica/ or + * http://www.ida.liu.se/projects/OpenModelica, + * and in the OpenModelica distribution. + * + * GNU AGPL version 3 is obtained from: + * https://www.gnu.org/licenses/licenses.html#GPL + * + * This program is distributed WITHOUT ANY WARRANTY; without + * even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE, EXCEPT AS EXPRESSLY SET FORTH + * IN THE BY RECIPIENT SELECTED SUBSIDIARY LICENSE CONDITIONS OF OSMC-PL. + * + * See the full OSMC Public License conditions for more details. + * + */ + +/* ----------------------------------------------------------------------------- + * Taken from bash-language-server and adapted to MetaModelica language server + * https://github.com/bash-lsp/bash-language-server/blob/main/server/src/analyser.ts + * ----------------------------------------------------------------------------- + */ + +import * as LSP from 'vscode-languageserver/node'; +import { TextDocument } from 'vscode-languageserver-textdocument'; + +import Parser = require('web-tree-sitter'); + +import { + getAllDeclarationsInTree +} from './util/declarations'; +import { logger } from './util/logger'; + +type AnalyzedDocument = { + document: TextDocument, + declarations: LSP.SymbolInformation[], + tree: Parser.Tree +} + +export default class Analyzer { + private parser: Parser; + private uriToAnalyzedDocument: Record = {}; + + constructor (parser: Parser) { + this.parser = parser; + } + + public analyze(document: TextDocument): LSP.Diagnostic[] { + logger.debug('analyze:'); + + const diagnostics: LSP.Diagnostic[] = []; + const fileContent = document.getText(); + const uri = document.uri; + + const tree = this.parser.parse(fileContent); + logger.debug(tree.rootNode.toString()); + + // Get declarations + const declarations = getAllDeclarationsInTree(tree, uri); + + // Update saved analysis for document uri + this.uriToAnalyzedDocument[uri] = { + document, + declarations, + tree + }; + + return diagnostics; + } + + /** + * Get all symbol declarations in the given file. This is used for generating an outline. + * + * TODO: convert to DocumentSymbol[] which is a hierarchy of symbols found in a given text document. + */ + public getDeclarationsForUri(uri: string): LSP.SymbolInformation[] { + const tree = this.uriToAnalyzedDocument[uri]?.tree; + + if (!tree?.rootNode) { + return []; + } + + return getAllDeclarationsInTree(tree, uri); + } +} diff --git a/server/src/parser.ts b/server/src/parser.ts new file mode 100644 index 0000000..ba3ee15 --- /dev/null +++ b/server/src/parser.ts @@ -0,0 +1,64 @@ +/* + * This file is part of OpenModelica. + * + * Copyright (c) 1998-2024, Open Source Modelica Consortium (OSMC), + * c/o Linköpings universitet, Department of Computer and Information Science, + * SE-58183 Linköping, Sweden. + * + * All rights reserved. + * + * THIS PROGRAM IS PROVIDED UNDER THE TERMS OF AGPL VERSION 3 LICENSE OR + * THIS OSMC PUBLIC LICENSE (OSMC-PL) VERSION 1.8. + * ANY USE, REPRODUCTION OR DISTRIBUTION OF THIS PROGRAM CONSTITUTES + * RECIPIENT'S ACCEPTANCE OF THE OSMC PUBLIC LICENSE OR THE GNU AGPL + * VERSION 3, ACCORDING TO RECIPIENTS CHOICE. + * + * The OpenModelica software and the OSMC (Open Source Modelica Consortium) + * Public License (OSMC-PL) are obtained from OSMC, either from the above + * address, from the URLs: + * http://www.openmodelica.org or + * https://github.com/OpenModelica/ or + * http://www.ida.liu.se/projects/OpenModelica, + * and in the OpenModelica distribution. + * + * GNU AGPL version 3 is obtained from: + * https://www.gnu.org/licenses/licenses.html#GPL + * + * This program is distributed WITHOUT ANY WARRANTY; without + * even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE, EXCEPT AS EXPRESSLY SET FORTH + * IN THE BY RECIPIENT SELECTED SUBSIDIARY LICENSE CONDITIONS OF OSMC-PL. + * + * See the full OSMC Public License conditions for more details. + * + */ + +/* ----------------------------------------------------------------------------- + * Taken from bash-language-server and adapted to MetaModelica language server + * https://github.com/bash-lsp/bash-language-server/blob/main/server/src/parser.ts + * ----------------------------------------------------------------------------- + */ + +import Parser from 'web-tree-sitter'; +import * as fs from 'fs'; +import * as path from 'path'; + +/** + * Initialize tree-sitter parser and load MetaModelica language. + * + * @returns tree-sitter-metamodelica parser + */ +export async function initializeParser(): Promise { + await Parser.init(); + const parser = new Parser; + + const metamodelicaWasmFile = path.join(__dirname, 'tree-sitter-metamodelica.wasm'); + if (!fs.existsSync(metamodelicaWasmFile)) { + throw new Error(`Can't find 'tree-sitter-metamodelica.wasm' at ${metamodelicaWasmFile}`); + } + + const MetaModelica = await Parser.Language.load(metamodelicaWasmFile); + parser.setLanguage(MetaModelica); + + return parser; +} diff --git a/server/src/server.ts b/server/src/server.ts new file mode 100644 index 0000000..395c49e --- /dev/null +++ b/server/src/server.ts @@ -0,0 +1,173 @@ +/* + * This file is part of OpenModelica. + * + * Copyright (c) 1998-2024, Open Source Modelica Consortium (OSMC), + * c/o Linköpings universitet, Department of Computer and Information Science, + * SE-58183 Linköping, Sweden. + * + * All rights reserved. + * + * THIS PROGRAM IS PROVIDED UNDER THE TERMS OF AGPL VERSION 3 LICENSE OR + * THIS OSMC PUBLIC LICENSE (OSMC-PL) VERSION 1.8. + * ANY USE, REPRODUCTION OR DISTRIBUTION OF THIS PROGRAM CONSTITUTES + * RECIPIENT'S ACCEPTANCE OF THE OSMC PUBLIC LICENSE OR THE GNU AGPL + * VERSION 3, ACCORDING TO RECIPIENTS CHOICE. + * + * The OpenModelica software and the OSMC (Open Source Modelica Consortium) + * Public License (OSMC-PL) are obtained from OSMC, either from the above + * address, from the URLs: + * http://www.openmodelica.org or + * https://github.com/OpenModelica/ or + * http://www.ida.liu.se/projects/OpenModelica, + * and in the OpenModelica distribution. + * + * GNU AGPL version 3 is obtained from: + * https://www.gnu.org/licenses/licenses.html#GPL + * + * This program is distributed WITHOUT ANY WARRANTY; without + * even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE, EXCEPT AS EXPRESSLY SET FORTH + * IN THE BY RECIPIENT SELECTED SUBSIDIARY LICENSE CONDITIONS OF OSMC-PL. + * + * See the full OSMC Public License conditions for more details. + * + */ + +/* ----------------------------------------------------------------------------- + * Taken from bash-language-server and adapted to MetaModelica language server + * https://github.com/bash-lsp/bash-language-server/blob/main/server/src/server.ts + * ----------------------------------------------------------------------------- + */ + +import * as LSP from 'vscode-languageserver/node'; +import { TextDocument} from 'vscode-languageserver-textdocument'; + +import { initializeParser } from './parser'; +import Analyzer from './analyzer'; +import { logger, setLogConnection, setLogLevel } from './util/logger'; + +/** + * MetaModelicaServer collection all the important bits and bobs. + */ +export class MetaModelicaServer { + analyzer: Analyzer; + private clientCapabilities: LSP.ClientCapabilities; + private connection: LSP.Connection; + private documents: LSP.TextDocuments = new LSP.TextDocuments(TextDocument); + + private constructor( + analyzer: Analyzer, + clientCapabilities: LSP.ClientCapabilities, + connection: LSP.Connection + ) { + this.analyzer = analyzer; + this.clientCapabilities = clientCapabilities; + this.connection = connection; + } + + public static async initialize( + connection: LSP.Connection, + { capabilities }: LSP.InitializeParams, + ): Promise { + + // Initialize logger + setLogConnection(connection); + setLogLevel('debug'); + logger.debug('Initializing...'); + + const parser = await initializeParser(); + const analyzer = new Analyzer(parser); + + const server = new MetaModelicaServer(analyzer, capabilities, connection); + + logger.debug('Initialized'); + return server; + } + + /** + * Return what parts of the language server protocol are supported by ModelicaServer. + */ + public capabilities(): LSP.ServerCapabilities { + return { + textDocumentSync: LSP.TextDocumentSyncKind.Full, + completionProvider: undefined, + hoverProvider: false, + signatureHelpProvider: undefined, + documentSymbolProvider: true, + colorProvider: false, + semanticTokensProvider: undefined + }; + } + + public register(connection: LSP.Connection): void { + + let currentDocument: TextDocument | null = null; + let initialized = false; + + // Make the text document manager listen on the connection + // for open, change and close text document events + this.documents.listen(this.connection); + + connection.onDocumentSymbol(this.onDocumentSymbol.bind(this)); + + connection.onInitialized(async () => { + initialized = true; + if (currentDocument) { + // If we already have a document, analyze it now that we're initialized + // and the linter is ready. + this.analyzeDocument(currentDocument); + } + }); + + // The content of a text document has changed. This event is emitted + // when the text document first opened or when its content has changed. + this.documents.onDidChangeContent(({ document }) => { + logger.debug('onDidChangeContent'); + + // We need to define some timing to wait some time or until whitespace is typed + // to update the tree or we are doing this on every key stroke + + currentDocument = document; + if (initialized) { + this.analyzeDocument(document); + } + }); + } + + + private async analyzeDocument(document: TextDocument) { + const diagnostics = this.analyzer.analyze(document); + } + + /** + * Provide symbols defined in document. + * + * @param params Unused. + * @returns Symbol information. + */ + private onDocumentSymbol(params: LSP.DocumentSymbolParams): LSP.SymbolInformation[] { + // TODO: ideally this should return LSP.DocumentSymbol[] instead of LSP.SymbolInformation[] + // which is a hierarchy of symbols. + // https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textDocument_documentSymbol + logger.debug(`onDocumentSymbol`); + return this.analyzer.getDeclarationsForUri(params.textDocument.uri); + } + +} + +// Create a connection for the server, using Node's IPC as a transport. +// Also include all preview / proposed LSP features. +const connection = LSP.createConnection(LSP.ProposedFeatures.all); + +connection.onInitialize( + async (params: LSP.InitializeParams): Promise => { + const server = await MetaModelicaServer.initialize(connection, params); + server.register(connection); + return { + capabilities: server.capabilities(), + }; + } +); + +// Listen on the connection +connection.listen(); diff --git a/server/src/test/server.test.ts b/server/src/test/server.test.ts new file mode 100644 index 0000000..28d0633 --- /dev/null +++ b/server/src/test/server.test.ts @@ -0,0 +1,62 @@ +/* + * This file is part of OpenModelica. + * + * Copyright (c) 1998-2024, Open Source Modelica Consortium (OSMC), + * c/o Linköpings universitet, Department of Computer and Information Science, + * SE-58183 Linköping, Sweden. + * + * All rights reserved. + * + * THIS PROGRAM IS PROVIDED UNDER THE TERMS OF AGPL VERSION 3 LICENSE OR + * THIS OSMC PUBLIC LICENSE (OSMC-PL) VERSION 1.8. + * ANY USE, REPRODUCTION OR DISTRIBUTION OF THIS PROGRAM CONSTITUTES + * RECIPIENT'S ACCEPTANCE OF THE OSMC PUBLIC LICENSE OR THE GNU AGPL + * VERSION 3, ACCORDING TO RECIPIENTS CHOICE. + * + * The OpenModelica software and the OSMC (Open Source Modelica Consortium) + * Public License (OSMC-PL) are obtained from OSMC, either from the above + * address, from the URLs: + * http://www.openmodelica.org or + * https://github.com/OpenModelica/ or + * http://www.ida.liu.se/projects/OpenModelica, + * and in the OpenModelica distribution. + * + * GNU AGPL version 3 is obtained from: + * https://www.gnu.org/licenses/licenses.html#GPL + * + * This program is distributed WITHOUT ANY WARRANTY; without + * even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE, EXCEPT AS EXPRESSLY SET FORTH + * IN THE BY RECIPIENT SELECTED SUBSIDIARY LICENSE CONDITIONS OF OSMC-PL. + * + * See the full OSMC Public License conditions for more details. + * + */ + +import * as Mocha from 'mocha'; +import * as assert from 'assert'; +import * as Parser from 'web-tree-sitter'; + +import { initializeParser } from '../parser'; + +const metaModelicaTestString = ` +model M "Hello World MetaModelica" + Real x(start=1,fixed=true) "state"; +equations + der(x) = -0.5*x; +end M; +`; +const parsedMetaModelicaTestString = "(stored_definitions storedDefinitions: (stored_definition classDefinition: (class_definition classPrefixes: (class_prefixes) classSpecifier: (long_class_specifier identifier: (IDENT) descriptionString: (description_string value: (STRING)) (element_list element: (named_element componentClause: (component_clause typeSpecifier: (type_specifier name: (name identifier: (IDENT))) componentDeclarations: (component_list componentDeclaration: (component_declaration declaration: (declaration identifier: (IDENT) modification: (modification classModification: (class_modification arguments: (argument_list argument: (element_modification name: (name identifier: (IDENT)) modification: (modification expression: (expression (simple_expression (primary_expression (literal_expression (unsigned_integer_literal_expression (UNSIGNED_INTEGER)))))))) argument: (element_modification name: (name identifier: (IDENT)) modification: (modification expression: (expression (simple_expression (primary_expression (literal_expression (logical_literal_expression))))))))))) descriptionString: (description_string value: (STRING)))))) element: (named_element componentClause: (component_clause typeSpecifier: (type_specifier name: (name identifier: (IDENT))) componentDeclarations: (component_list componentDeclaration: (component_declaration declaration: (declaration identifier: (IDENT) modification: (modification classModification: (class_modification arguments: (argument_list argument: (element_modification name: (name identifier: (IDENT))))) expression: (expression (simple_expression (binary_expression operand1: (simple_expression (unary_expression operand: (simple_expression (primary_expression (literal_expression (unsigned_real_literal_expression (UNSIGNED_REAL))))))) operand2: (simple_expression (primary_expression (component_reference identifier: (IDENT)))))))))))))) endIdentifier: (IDENT)))))"; + +describe('MetaModelica tree-sitter parser', () => { + it('Initialize parser', async () => { + const parser = await initializeParser(); + }); + + it('Parse string', async () => { + const parser = await initializeParser(); + const tree = parser.parse(metaModelicaTestString); + const parsedString = tree.rootNode.toString(); + assert.equal(parsedString, parsedMetaModelicaTestString); + }); +}); diff --git a/server/src/tree-sitter-metamodelica.wasm b/server/src/tree-sitter-metamodelica.wasm new file mode 100644 index 0000000000000000000000000000000000000000..697e68d6f28aae1c4e8949014f66e0e52cbc7a14 GIT binary patch literal 143043 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 z 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 typeof data === "string" && data.trim().length == 0; + +export type GlobalDeclarations = { [word: string]: LSP.SymbolInformation } +export type Declarations = { [word: string]: LSP.SymbolInformation[] } + +const GLOBAL_DECLARATION_LEAF_NODE_TYPES = new Set([ + 'if_statement', + 'function_definition', +]); + +/** + * Returns all declarations (functions or variables) from a given tree. + * + * @param tree Tree-sitter tree. + * @param uri The document's uri. + * @returns Symbol information for all declarations. + */ +export function getAllDeclarationsInTree(tree: Parser.Tree, uri: string): LSP.SymbolInformation[] { + const symbols: LSP.SymbolInformation[] = []; + + TreeSitterUtil.forEach(tree.rootNode, (node) => { + const symbol = getDeclarationSymbolFromNode(node, uri); + if (symbol) { + symbols.push(symbol); + } + }); + + return symbols; +} + +/** + * Converts node to symbol information. + * + * @param tree Tree-sitter tree. + * @param uri The document's uri. + * @returns Symbol information from node. + */ +export function nodeToSymbolInformation(node: Parser.SyntaxNode, uri: string): LSP.SymbolInformation | null { + const named = node.firstNamedChild; + + if (named === null) { + return null; + } + + const name = TreeSitterUtil.getIdentifier(node); + if (name === undefined || isEmpty(name)) { + return null; + } + + const kind = getKind(node); + + const containerName = + TreeSitterUtil.findParent(node, (p) => p.type === 'function_definition') + ?.firstNamedChild?.text || ''; + + return LSP.SymbolInformation.create( + name, + kind || LSP.SymbolKind.Variable, + TreeSitterUtil.range(node), + uri, + containerName, + ); +} + +/** + * Get declaration from node and convert to symbol information. + * + * @param node Root node of tree. + * @param uri The associated URI for this document. + * @returns LSP symbol information for definition. + */ +function getDeclarationSymbolFromNode(node: Parser.SyntaxNode, uri: string): LSP.SymbolInformation | null { + if (TreeSitterUtil.isDefinition(node)) { + return nodeToSymbolInformation(node, uri); + } + + return null; +} + +/** + * Returns symbol kind from class definition node. + * + * @param node Node containing class_definition + * @returns Symbol kind or `undefined`. + */ +function getKind(node: Parser.SyntaxNode): LSP.SymbolKind | undefined { + + const classPrefixes = TreeSitterUtil.getClassPrefixes(node)?.split(/\s+/); + if (classPrefixes === undefined) { + return undefined; + } + + switch (classPrefixes[classPrefixes.length - 1]) { + case 'block': + case 'class': + case 'connector': + case 'model': + return LSP.SymbolKind.Class; + case 'function': + case 'operator': + return LSP.SymbolKind.Function; + case 'package': + case 'record': + return LSP.SymbolKind.Package; + case 'type': + return LSP.SymbolKind.TypeParameter; + default: + return undefined; + } +} diff --git a/server/src/util/logger.ts b/server/src/util/logger.ts new file mode 100644 index 0000000..a3ffb24 --- /dev/null +++ b/server/src/util/logger.ts @@ -0,0 +1,168 @@ +/* + * This file is part of OpenModelica. + * + * Copyright (c) 1998-2024, Open Source Modelica Consortium (OSMC), + * c/o Linköpings universitet, Department of Computer and Information Science, + * SE-58183 Linköping, Sweden. + * + * All rights reserved. + * + * THIS PROGRAM IS PROVIDED UNDER THE TERMS OF AGPL VERSION 3 LICENSE OR + * THIS OSMC PUBLIC LICENSE (OSMC-PL) VERSION 1.8. + * ANY USE, REPRODUCTION OR DISTRIBUTION OF THIS PROGRAM CONSTITUTES + * RECIPIENT'S ACCEPTANCE OF THE OSMC PUBLIC LICENSE OR THE GNU AGPL + * VERSION 3, ACCORDING TO RECIPIENTS CHOICE. + * + * The OpenModelica software and the OSMC (Open Source Modelica Consortium) + * Public License (OSMC-PL) are obtained from OSMC, either from the above + * address, from the URLs: + * http://www.openmodelica.org or + * https://github.com/OpenModelica/ or + * http://www.ida.liu.se/projects/OpenModelica, + * and in the OpenModelica distribution. + * + * GNU AGPL version 3 is obtained from: + * https://www.gnu.org/licenses/licenses.html#GPL + * + * This program is distributed WITHOUT ANY WARRANTY; without + * even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE, EXCEPT AS EXPRESSLY SET FORTH + * IN THE BY RECIPIENT SELECTED SUBSIDIARY LICENSE CONDITIONS OF OSMC-PL. + * + * See the full OSMC Public License conditions for more details. + * + */ + +/* ----------------------------------------------------------------------------- + * Taken from bash-language-server and adapted to MetaModelica language server + * https://github.com/bash-lsp/bash-language-server/blob/main/server/src/parser.ts + * ----------------------------------------------------------------------------- + */ + +import * as LSP from 'vscode-languageserver'; + +export const LOG_LEVEL_ENV_VAR = 'METAMODELICA_IDE_LOG_LEVEL'; +export const LOG_LEVELS = ['debug', 'log', 'info', 'warning', 'error'] as const; +export const DEFAULT_LOG_LEVEL: LogLevel = 'info'; + +type LogLevel = (typeof LOG_LEVELS)[number] + +const LOG_LEVELS_TO_MESSAGE_TYPES: { + [logLevel in LogLevel]: LSP.MessageType +} = { + debug: LSP.MessageType.Debug, + log: LSP.MessageType.Log, + info: LSP.MessageType.Info, + warning: LSP.MessageType.Warning, + error: LSP.MessageType.Error, +} as const; + +// Singleton madness to allow for logging from anywhere in the codebase +let _connection: LSP.Connection | null = null; +let _logLevel: LSP.MessageType = getLogLevelFromEnvironment(); + +/** + * Set the log connection. Should be done at startup. + */ +export function setLogConnection(connection: LSP.Connection) { + _connection = connection; +} + +/** + * Set the minimum log level. + */ +export function setLogLevel(logLevel: LogLevel) { + _logLevel = LOG_LEVELS_TO_MESSAGE_TYPES[logLevel]; +} + +export class Logger { + private prefix: string; + + constructor({ prefix = '' }: { prefix?: string } = {}) { + this.prefix = prefix; + } + + static MESSAGE_TYPE_TO_LOG_LEVEL_MSG: Record = { + [LSP.MessageType.Error]: 'ERROR ⛔️', + [LSP.MessageType.Warning]: 'WARNING ⛔️', + [LSP.MessageType.Info]: 'INFO', + [LSP.MessageType.Log]: 'LOG', + [LSP.MessageType.Debug]: 'DEBUG' + }; + + public log(severity: LSP.MessageType, messageObjects: any[]) { + if (_logLevel < severity) { + return; + } + + if (!_connection) { + // eslint-disable-next-line no-console + console.warn(`The logger's LSP Connection is not set. Dropping messages`); + return; + } + + const formattedMessage = messageObjects + .map((p) => { + if (p instanceof Error) { + return p.stack || p.message; + } + + if (typeof p === 'object') { + return JSON.stringify(p, null, 2); + } + + return p; + }) + .join(' '); + + const level = Logger.MESSAGE_TYPE_TO_LOG_LEVEL_MSG[severity]; + const prefix = this.prefix ? `${this.prefix} - ` : ''; + const time = new Date().toISOString().substring(11, 23); + const message = `${time} ${level} ${prefix}${formattedMessage}`; + + _connection.sendNotification(LSP.LogMessageNotification.type, { + type: severity, + message, + }); + } + + public debug(message: string, ...additionalArgs: any[]) { + this.log(LSP.MessageType.Debug, [message, ...additionalArgs]); + } + public info(message: string, ...additionalArgs: any[]) { + this.log(LSP.MessageType.Info, [message, ...additionalArgs]); + } + public warn(message: string, ...additionalArgs: any[]) { + this.log(LSP.MessageType.Warning, [message, ...additionalArgs]); + } + public error(message: string, ...additionalArgs: any[]) { + this.log(LSP.MessageType.Error, [message, ...additionalArgs]); + } +} + +/** + * Default logger. + */ +export const logger = new Logger(); + +/** + * Get the log level from the environment, before the server initializes. + * Should only be used internally. + */ +export function getLogLevelFromEnvironment(): LSP.MessageType { + const logLevelFromEnvironment = process.env[LOG_LEVEL_ENV_VAR] as LogLevel | undefined; + if (logLevelFromEnvironment) { + const logLevel = LOG_LEVELS_TO_MESSAGE_TYPES[logLevelFromEnvironment]; + if (logLevel) { + return logLevel; + } + // eslint-disable-next-line no-console + console.warn( + `Invalid ${LOG_LEVEL_ENV_VAR} "${logLevelFromEnvironment}", expected one of: ${Object.keys( + LOG_LEVELS_TO_MESSAGE_TYPES, + ).join(', ')}`, + ); + } + + return LOG_LEVELS_TO_MESSAGE_TYPES[DEFAULT_LOG_LEVEL]; +} diff --git a/server/src/util/test/declarations.test.ts b/server/src/util/test/declarations.test.ts new file mode 100644 index 0000000..9eb313c --- /dev/null +++ b/server/src/util/test/declarations.test.ts @@ -0,0 +1,84 @@ +/* + * This file is part of OpenModelica. + * + * Copyright (c) 1998-2024, Open Source Modelica Consortium (OSMC), + * c/o Linköpings universitet, Department of Computer and Information Science, + * SE-58183 Linköping, Sweden. + * + * All rights reserved. + * + * THIS PROGRAM IS PROVIDED UNDER THE TERMS OF AGPL VERSION 3 LICENSE OR + * THIS OSMC PUBLIC LICENSE (OSMC-PL) VERSION 1.8. + * ANY USE, REPRODUCTION OR DISTRIBUTION OF THIS PROGRAM CONSTITUTES + * RECIPIENT'S ACCEPTANCE OF THE OSMC PUBLIC LICENSE OR THE GNU AGPL + * VERSION 3, ACCORDING TO RECIPIENTS CHOICE. + * + * The OpenModelica software and the OSMC (Open Source Modelica Consortium) + * Public License (OSMC-PL) are obtained from OSMC, either from the above + * address, from the URLs: + * http://www.openmodelica.org or + * https://github.com/OpenModelica/ or + * http://www.ida.liu.se/projects/OpenModelica, + * and in the OpenModelica distribution. + * + * GNU AGPL version 3 is obtained from: + * https://www.gnu.org/licenses/licenses.html#GPL + * + * This program is distributed WITHOUT ANY WARRANTY; without + * even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE, EXCEPT AS EXPRESSLY SET FORTH + * IN THE BY RECIPIENT SELECTED SUBSIDIARY LICENSE CONDITIONS OF OSMC-PL. + * + * See the full OSMC Public License conditions for more details. + * + */ + +import * as assert from 'assert'; +import * as LSP from 'vscode-languageserver/node'; + +import { initializeParser } from '../../parser'; +import { getAllDeclarationsInTree, nodeToSymbolInformation } from '../declarations'; + +const metaModelicaTestString = ` +model M "Description" +end M; + +function foo +end foo; + +type Temperature = Real(unit = "K"); +`; + +const expectedDefinitions = ["M", "foo", "Temperature"]; +const expectedTypes = [LSP.SymbolKind.Class, LSP.SymbolKind.Function, LSP.SymbolKind.TypeParameter]; + +describe('nodeToSymbolInformation', () => { + it('type to TypeParameter', async () => { + const parser = await initializeParser(); + const tree = parser.parse("type Temperature = Real(unit = \"K \");"); + + const classNode = tree.rootNode.childForFieldName('storedDefinitions')!.childForFieldName('classDefinition')!; + const symbol = nodeToSymbolInformation(classNode, "file.mo"); + + assert.equal(symbol?.name, 'Temperature'); + assert.equal(symbol?.kind, LSP.SymbolKind.TypeParameter); + }); +}); + +describe('getAllDeclarationsInTree', () => { + it('Definitions and types', async () => { + const parser = await initializeParser(); + const tree = parser.parse(metaModelicaTestString); + const symbols = getAllDeclarationsInTree(tree, "file.mo"); + + const definitions: string[] = []; + const types: LSP.SymbolKind[] = []; + for (let i = 0; i < symbols.length; i++) { + definitions.push(symbols[i].name); + types.push(symbols[i].kind); + } + + assert.deepEqual(definitions, expectedDefinitions); + assert.deepEqual(types, expectedTypes); + }); +}); diff --git a/server/src/util/test/util.test.ts b/server/src/util/test/util.test.ts new file mode 100644 index 0000000..1476970 --- /dev/null +++ b/server/src/util/test/util.test.ts @@ -0,0 +1,50 @@ +/* + * This file is part of OpenModelica. + * + * Copyright (c) 1998-2024, Open Source Modelica Consortium (OSMC), + * c/o Linköpings universitet, Department of Computer and Information Science, + * SE-58183 Linköping, Sweden. + * + * All rights reserved. + * + * THIS PROGRAM IS PROVIDED UNDER THE TERMS OF AGPL VERSION 3 LICENSE OR + * THIS OSMC PUBLIC LICENSE (OSMC-PL) VERSION 1.8. + * ANY USE, REPRODUCTION OR DISTRIBUTION OF THIS PROGRAM CONSTITUTES + * RECIPIENT'S ACCEPTANCE OF THE OSMC PUBLIC LICENSE OR THE GNU AGPL + * VERSION 3, ACCORDING TO RECIPIENTS CHOICE. + * + * The OpenModelica software and the OSMC (Open Source Modelica Consortium) + * Public License (OSMC-PL) are obtained from OSMC, either from the above + * address, from the URLs: + * http://www.openmodelica.org or + * https://github.com/OpenModelica/ or + * http://www.ida.liu.se/projects/OpenModelica, + * and in the OpenModelica distribution. + * + * GNU AGPL version 3 is obtained from: + * https://www.gnu.org/licenses/licenses.html#GPL + * + * This program is distributed WITHOUT ANY WARRANTY; without + * even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE, EXCEPT AS EXPRESSLY SET FORTH + * IN THE BY RECIPIENT SELECTED SUBSIDIARY LICENSE CONDITIONS OF OSMC-PL. + * + * See the full OSMC Public License conditions for more details. + * + */ + +import * as assert from 'assert'; + +import { initializeParser } from '../../parser'; +import * as TreeSitterUtil from '../tree-sitter'; + +describe('getIdentifier', () => { + it('Identifier of type class', async () => { + const parser = await initializeParser(); + const tree = parser.parse("type Temperature = Real(unit = \"K \");"); + const classNode = tree.rootNode.childForFieldName('storedDefinitions')!.childForFieldName('classDefinition')!; + const name = TreeSitterUtil.getIdentifier(classNode); + + assert.equal(name, 'Temperature'); + }); +}); diff --git a/server/src/util/tree-sitter.ts b/server/src/util/tree-sitter.ts new file mode 100644 index 0000000..28d5447 --- /dev/null +++ b/server/src/util/tree-sitter.ts @@ -0,0 +1,171 @@ +/* + * This file is part of OpenModelica. + * + * Copyright (c) 1998-2024, Open Source Modelica Consortium (OSMC), + * c/o Linköpings universitet, Department of Computer and Information Science, + * SE-58183 Linköping, Sweden. + * + * All rights reserved. + * + * THIS PROGRAM IS PROVIDED UNDER THE TERMS OF AGPL VERSION 3 LICENSE OR + * THIS OSMC PUBLIC LICENSE (OSMC-PL) VERSION 1.8. + * ANY USE, REPRODUCTION OR DISTRIBUTION OF THIS PROGRAM CONSTITUTES + * RECIPIENT'S ACCEPTANCE OF THE OSMC PUBLIC LICENSE OR THE GNU AGPL + * VERSION 3, ACCORDING TO RECIPIENTS CHOICE. + * + * The OpenModelica software and the OSMC (Open Source Modelica Consortium) + * Public License (OSMC-PL) are obtained from OSMC, either from the above + * address, from the URLs: + * http://www.openmodelica.org or + * https://github.com/OpenModelica/ or + * http://www.ida.liu.se/projects/OpenModelica, + * and in the OpenModelica distribution. + * + * GNU AGPL version 3 is obtained from: + * https://www.gnu.org/licenses/licenses.html#GPL + * + * This program is distributed WITHOUT ANY WARRANTY; without + * even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE, EXCEPT AS EXPRESSLY SET FORTH + * IN THE BY RECIPIENT SELECTED SUBSIDIARY LICENSE CONDITIONS OF OSMC-PL. + * + * See the full OSMC Public License conditions for more details. + * + */ + +/* ----------------------------------------------------------------------------- + * Taken from bash-language-server and adapted to MetaModelica language server + * https://github.com/bash-lsp/bash-language-server/blob/main/server/src/util/tree-sitter.ts + * ----------------------------------------------------------------------------- + */ + +import * as LSP from 'vscode-languageserver/node'; +import { SyntaxNode } from 'web-tree-sitter'; + +import { logger } from './logger'; + +/** + * Recursively iterate over all nodes in a tree. + * + * @param node The node to start iterating from + * @param callback The callback to call for each node. Return false to stop following children. + */ +export function forEach(node: SyntaxNode, callback: (n: SyntaxNode) => void | boolean) { + const followChildren = callback(node) !== false; + if (followChildren && node.children.length) { + node.children.forEach((n) => forEach(n, callback)); + } +} + +/** + * Find first node where callback returns true. + * + * Traverse tree depth first, left to right. + * + * @param start The node to start iterating from + * @param callback Callback returning true if node is searched node. + */ +export function findFirst(start: SyntaxNode, callback: (n: SyntaxNode) => boolean): SyntaxNode | null { + + const cursor = start.walk(); + let reachedRoot = false; + let retracing = false; + + while (!reachedRoot) { + const node = cursor.currentNode(); + if (callback(node) === true ) { + return node; + } + + if (cursor.gotoFirstChild()) { + continue; + } + + if (cursor.gotoNextSibling()) { + continue; + } + + retracing = true; + while (retracing) { + if (!cursor.gotoParent()) { + retracing = false; + reachedRoot = true; + } + + if (cursor.gotoNextSibling()) { + retracing = false; + } + } + } + + return null; +} + +export function range(n: SyntaxNode): LSP.Range { + return LSP.Range.create( + n.startPosition.row, + n.startPosition.column, + n.endPosition.row, + n.endPosition.column, + ); +} + +/** + * Tell if a node is a definition. + * + * @param n Node of tree + * @returns `true` if node is a definition, `false` otherwise. + */ +export function isDefinition(n: SyntaxNode): boolean { + switch (n.type) { + case 'class_definition': + return true; + default: + return false; + } +} + +export function findParent( + start: SyntaxNode, + predicate: (n: SyntaxNode) => boolean, +): SyntaxNode | null { + let node = start.parent; + while (node !== null) { + if (predicate(node)) { + return node; + } + node = node.parent; + } + return null; +} + +/** + * Get identifier from node. + * + * @param start Syntax tree node. + */ +export function getIdentifier(start: SyntaxNode): string | undefined { + + const node = findFirst(start, (n: SyntaxNode) => n.type == 'IDENT'); + return node?.text; +} + +/** + * Get class prefixes from `class_definition` node. + * + * @param node Class definition node. + * @returns String with class prefixes or `null` if no `class_prefixes` can be found. + */ +export function getClassPrefixes(node: SyntaxNode): string | null { + + if (node.type !== 'class_definition') { + return null; + } + + const classPrefixNode = node.childForFieldName('classPrefixes'); + if (classPrefixNode == null || classPrefixNode.type !== 'class_prefixes') { + return null; + } + + return classPrefixNode.text; +} diff --git a/server/tsconfig.json b/server/tsconfig.json new file mode 100644 index 0000000..3798269 --- /dev/null +++ b/server/tsconfig.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "module": "commonjs", + "target": "es2020", + "lib": [ + "es2020" + ], + "moduleResolution": "node", + "declaration": true, + "sourceMap": true, + "strict": true, + "outDir": "out", + "rootDir": "src", + "esModuleInterop": true + }, + "include": [ + "src", + "src/util" + ], + "exclude": [ + "node_modules", + ".vscode-test", + "src/test", + "src/util/test" + ] +} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..64f93b2 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "module": "ES2020", + "target": "es2020", + "lib": [ + "es2020" + ], + "outDir": "out", + "rootDir": "src", + "sourceMap": true + }, + "include": [ + "src" + ], + "exclude": [ + "node_modules", + ".vscode-test" + ], + "references": [ + { + "path": "./client" + }, + { + "path": "./server" + } + ] +} \ No newline at end of file