diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index db3c1264..326a72be 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -1,23 +1,46 @@
-name: Build
-run-name: Build the project
+name: Build and Test
+run-name: Build and Test
on:
workflow_dispatch:
push:
+ branches:
+ - "main"
+ - "dev"
+ pull_request:
+ branches:
+ - "main"
+ - "dev"
+ paths:
+ - ".github/workflows/build.yml"
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
+ cancel-in-progress: true
+
+defaults:
+ run:
+ shell: bash
+
jobs:
build:
runs-on: ubuntu-latest
steps:
- - name: install elan
- run: |
- set -o pipefail
- curl -sSfL https://github.com/leanprover/elan/releases/download/v3.0.0/elan-x86_64-unknown-linux-gnu.tar.gz | tar xz
- ./elan-init -y
- echo "$HOME/.elan/bin" >> $GITHUB_PATH
- uses: actions/checkout@v4
- - uses: actions/setup-node@v3
- - name: print lean and lake versions
- run: |
- lean --version
- lake --version
- - run: npm install
- - run: npm run build
+ - uses: actions/setup-node@v4
+ - name: Install elan, build and test server
+ uses: leanprover/lean-action@v1
+ with:
+ lake-package-directory: "server"
+ use-mathlib-cache: false
+ use-github-cache: false
+ auto-config: false
+ build: true
+ test: true
+ lint: false
+ - name: Install dependencies
+ run: npm install
+ - name: Build client for production
+ run: npm run build:client
+ - name: Cypress tests
+ if: always()
+ run: npm test
diff --git a/.gitignore b/.gitignore
index e7c076e7..55e664f8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,4 +6,7 @@ server/.lake
**/.DS_Store
logs/
relay/prev_cpu_metric
+relay/dist
+**/.i18n
+.idea
test.ecosystem.config.cjs
diff --git a/client/i18next-scanner.config.cjs b/client/i18next-scanner.config.cjs
index e658b99b..03fa5186 100644
--- a/client/i18next-scanner.config.cjs
+++ b/client/i18next-scanner.config.cjs
@@ -100,7 +100,7 @@ module.exports = {
// sourceType: 'module', // defaults to 'module'
// }
},
- lngs: lean4gameConfig.languages.map(e => e.iso),
+ lngs: lean4gameConfig.languages.keys(),
ns: [],
defaultLng: 'en',
defaultNs: 'translation',
diff --git a/client/public/RoboSurprised.png b/client/public/RoboSurprised.png
new file mode 100644
index 00000000..6e37dd4a
Binary files /dev/null and b/client/public/RoboSurprised.png differ
diff --git a/client/public/fonts/JuliaMono-Regular.ttf b/client/public/fonts/JuliaMono-Regular.ttf
new file mode 100644
index 00000000..30b84f3c
Binary files /dev/null and b/client/public/fonts/JuliaMono-Regular.ttf differ
diff --git a/client/public/fonts/LICENSE-JuliaMono b/client/public/fonts/LICENSE-JuliaMono
new file mode 100644
index 00000000..cc69da81
--- /dev/null
+++ b/client/public/fonts/LICENSE-JuliaMono
@@ -0,0 +1,93 @@
+Copyright (c) 2020 - 2023, cormullion
+with Reserved Font Name JuliaMono.
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+http://scripts.sil.org/OFL
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/client/public/fonts/LICENSE-NotoColorEmoji b/client/public/fonts/LICENSE-NotoColorEmoji
new file mode 100644
index 00000000..979c943e
--- /dev/null
+++ b/client/public/fonts/LICENSE-NotoColorEmoji
@@ -0,0 +1,93 @@
+Copyright 2021 Google Inc. All Rights Reserved.
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+https://openfontlicense.org
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/client/public/fonts/LICENSE-Roboto.txt b/client/public/fonts/LICENSE-Roboto.txt
new file mode 100644
index 00000000..75b52484
--- /dev/null
+++ b/client/public/fonts/LICENSE-Roboto.txt
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) 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. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/client/public/fonts/NotoColorEmoji-Regular.ttf b/client/public/fonts/NotoColorEmoji-Regular.ttf
new file mode 100644
index 00000000..05b42fdc
Binary files /dev/null and b/client/public/fonts/NotoColorEmoji-Regular.ttf differ
diff --git a/client/public/fonts/Roboto-Regular.ttf b/client/public/fonts/Roboto-Regular.ttf
new file mode 100644
index 00000000..ddf4bfac
Binary files /dev/null and b/client/public/fonts/Roboto-Regular.ttf differ
diff --git a/client/public/locales/de/translation.json b/client/public/locales/de/translation.json
index 9043b17d..7737b60c 100644
--- a/client/public/locales/de/translation.json
+++ b/client/public/locales/de/translation.json
@@ -1,7 +1,7 @@
{
"Tactics": "Taktiken",
- "Lean Game Server": "Lean-Lern-Spiel-Server",
- "
Game rules determine if it is allowed to skip levels and if the games runs checks to only allow unlocked tactics and theorems in proofs.
<1>Note: \"Unlocked\" tactics (or theorems) are determined by two things: The set of minimal tactics needed to solve a level, plus any tactics you unlocked in another level. That means if you unlock <1>simp1> in a level, you can use it henceforth in any level.1>The options are:
": "Die Spielregeln bestimmen ob es erlaubt ist, Levels zu überspringen und ob das Spiel überprüft welche Taktiken und Theoreme freigeschaltet sind und nur diese im Beweis akzeptiert.
<1>Bemerkung: \"Freigeschaltete\" Taktiken (und Theoreme) werden durch zwei Faktoren bestimmt: The Menge der Taktiken die minimal notwending sind um den Level zu lösen und dazu die Menge aller Taktiken, die in einem anderen Level freigeschaltet wurden. Das bedeutet wenn <1>simp1> in einem Level freigeschaltet wird, kann diese Taktik danach in jeglichen Levels verwendet werden.",
+ "Lean Game Server": "Lean-Spielserver",
+ "Game rules determine if it is allowed to skip levels and if the games runs checks to only allow unlocked tactics and theorems in proofs.
<1>Note: \"Unlocked\" tactics (or theorems) are determined by two things: The set of minimal tactics needed to solve a level, plus any tactics you unlocked in another level. That means if you unlock <1>simp1> in a level, you can use it henceforth in any level.1>The options are:
": "Die Spielregeln bestimmen ob es erlaubt ist, Levels zu überspringen und ob das Spiel überprüft welche Taktiken und Theoreme freigeschaltet sind und nur diese im Beweis akzeptiert.
<1>Bemerkung: \"Freigeschaltete\" Taktiken (und Theoreme) werden durch zwei Faktoren bestimmt: The Menge der Taktiken die minimal notwendig sind um den Level zu lösen und dazu die Menge aller Taktiken, die in einem anderen Level freigeschaltet wurden. Das bedeutet wenn <1>simp1> in einem Level freigeschaltet wird, kann diese Taktik danach in jeglichen Levels verwendet werden.",
"Game Rules": "Spielregeln",
"levels": "Level",
"tactics": "Taktiken",
@@ -9,34 +9,20 @@
"relaxed": "relaxed",
"none": "keine",
"Rules": "Regeln",
- "Intro": "Prolog",
- "Game Introduction": "Prolog",
- "World selection": "Übersicht",
+ "Intro": "Einführung",
"Start": "Start",
- "Inventory": "Inventar",
- "next level": "nächstes Level",
"Next": "Weiter",
- "back to world selection": "Zurück zur Übersicht",
- "Leave World": "Welt verlassen",
- "previous level": "voheriges Level",
"Previous": "Zurück",
"Editor mode is enforced!": "Editor kann nicht verlassen werden!",
"Editor mode": "Editor",
"Typewriter mode": "Schreibmaschine",
- "information, Impressum, privacy policy": "Informationen, Impressum, Privacy Policy",
"Preferences": "Einstellungen",
- "Game Info & Credits": "Spielinfo & Credits",
"Game Info": "Spielinfo",
- "Clear Progress": "Spielstand löschen",
"Erase": "Löschen",
- "Download Progress": "Spielstand herunterladen",
"Download": "Herunterladen",
- "Load Progress from JSON": "Spielstand aus JSON laden",
"Upload": "Laden",
"Home": "Home",
"back to games selection": "Zurück zur Spielauswahl",
- "close inventory": "Inventar schließen",
- "show inventory": "Inventar öffnen",
"World": "Welt",
"Show more help!": "Mehr Hilfe",
"Goal": "Beweisziel",
@@ -83,17 +69,24 @@
"Mobile": "Mobil",
"Auto": "Auto",
"Desktop": "Desktop",
- "<0>If you are considering writing your own game, you should use the <1>GameSkeleton Github Repo1> as a template and read <3>How to Create a Game3>.0><1>You can directly load your games into the server and play it using the correct URL. The <1>instructions above1> also explain the details for how to load your game to the server. We'd like to encourage you to contact us if you have any questions.1>Featured games on this page are added manually. Please get in contact and we'll happily add yours.
": "<0>Für alle, die selbst Spiel entwickeln möchten, gibt es ein <1>GameSkeleton Github Repo1> als Vorlage und die Anleitung <3>How to Create a Game3>.0><1>Die <1>Anleitung1> erklärt auch, wie ein solches Spiel mittels einer passenden URL auf den Sever geladen und gespiel werden kann. Fragen dazu beantworten wir gern.1>Als Kacheln sichtbar ist auf dieser Seite nur eine kuratierte Auswahl an existierenden Spielen. Wir erweitern diese Auswahl auf Anfrage sehr gerne.
",
- "Level": "Level",
- "Introduction": "Prolog",
- "Retry proof from here": "Ab hier neu ansetzen",
- "Retry": "Noch einmal",
- "Failed command": "Gescheiterter Befehl",
- "As this server runs lean on our university machines, it has a limited capacity. Our current estimate is about 70 simultaneous games.
": "Diese Server läuft auf universitäter Infrastruktur mit begrenzten Kapazitäten. Wir schätzen, dass die Belastungsgrenze bei rund 70 gleichzeitig laufenden Spielen besteht.",
- "<0>Most aspects of the games and the infrastructure are still in development. Feel free to file a <1>GitHub Issue1> about any problems you experience!0>": "Der Spieleserver und die alle Spiele befinden sich in fortlaufender Entwicklung. Wir bitten darum, Fehler und Ungereimtheiten als <1>GitHub Issue1> zu melden.",
- "This server has been developed as part of the project <1>ADAM: Anticipating the Digital Age of Mathematics1> at Heinrich Heine University Düsseldorf.": "Die Lean-Spiele-Software und dieser Spiele-Server werden als Teils der Projekts <1>ADAM: Anticipating the Digital Age of Mathematics1> an der Heinrich-Heine-Universität Düsseldorf entwickelt.",
- "Server capacity": "Server-Auslastung",
- "RAM": "RAM",
- " used": "",
- "CPU": "CPU"
+ "<0>If you are considering writing your own game, you should use the <1>GameSkeleton Github Repo1> as a template and read <3>How to Create a Game3>.0><1>You can directly load your games into the server and play it using the correct URL. The <1>instructions above1> also explain the details for how to load your game to the server. We'd like to encourage you to contact us if you have any questions.1>Featured games on this page are added manually. Please get in contact and we'll happily add yours.
": "",
+ "Level": "",
+ "Introduction": "Einführung",
+ "Retry proof from here": "Ab hier erneut versuchen",
+ "Retry": "",
+ "Failed command": "Befehl fehlgeschlagen",
+ "view the Lean game server on Github": "Lean game Server auf Github ansehen",
+ "Theorem": "Theorem",
+ "Impressum": "Impressum",
+ "Privacy Policy": "Datenschutzerklärung",
+ "<0>Impressum0><1>Contact: Marcus Zibrowius, Jon Eugster Mathematisches Institut der Heinrich-Heine-Universität Düsseldorf Universitätsstr. 1 40225 Düsseldorf Germany +49 211 81-14690 <14>Contact Details14>1><2>Legal form: The Heinrich Heine University Düsseldorf is a corporation under public law. It is legally represented by the Rector Prof. Dr. Anja Steinbeck. The responsible supervisory authority is the Ministry of Culture and Science of North Rhine-Westphalia, Völklinger Straße 49, 40221 Düsseldorf.2><3>VAT identification number: according to §27a Sales Tax Act DE 8112224163><4><0>Impressum HHU0>4>": "<0>Impressum0><1>Kontakt: Marcus Zibrowius, Jon Eugster Mathematisches Institut der Heinrich-Heine-Universität Düsseldorf Universitätsstr. 1 40225 Düsseldorf Deutschland +49 211 81-14690 <14>Kontaktinformationen14>1><2>Rechtsform: Die Heinrich-Heine Universität Düsseldorf ist eine Körperschaft des Öffentlichen Rechts. Sie wird durch die Rektorin Prof. Dr. Anja Steinbeck gesetzlich vertreten. Zuständige Aufsichtsbehörde ist das Ministerium für Kultur und Wissenschaft des Landes Nordrhein-Westfalen, Völklinger Straße 49, 40221 Düsseldorf.2><3>Umsatzsteuer-Identifikationsnummer: gemäß §27a Umsatzsteuergesetz DE 8112224163><4><0>Impressum der HHU0>4>",
+ "<0>Progress saving0><1>The game stores your progress in your local browser storage. If you delete it, your progress will be lost! Warning: In most browsers, deleting cookies will also clear the local storage (or \"local site data\"). Make sure to download your game progress first!1><2>Development2><3>The game engine has been created by Alexander Bentkamp , Jon Eugster . On a prototype by Patrick Massot .3><4>The source code of this Lean game engine is <1>available on Github1>. If you experience any problems, please file an <3>Issue on Github3> or get directly in contact.4><5>Funding5><6>The game engine has been developed as part of the project <1>ADAM: Anticipating the Digital Age of Mathematics1> at Heinrich-Heine-Universität Düsseldorf. It is funded by the Stiftung Innovation in der Hochschullehre as part of project Freiraum 2022 .6>": "<0>Spielstandspeicherung0><1>Das Spiel speichert den Spielstand im lokalen Browserspeicher. Wird dieser gelöscht, ist der Spielstand nicht wiederherstellbar! Achtung: In üblichen Browsern bewirkt ein löschen von Cookies auch ein löschen des lokalen Browserspeichers (z.B. \"local site data\"). Der Spielstand sollte vorgehend heruntergeladen werden!1><2>Entwicklung2><3>Der Spieleserver wurde entwickelt von Alexander Bentkamp , Jon Eugster . Basierend auf einem Prototyp von Patrick Massot .3><4>Der Sourcecode dieses Lean-Game-Engine ist <1>auf Github verfügbar1>. Bei Problemen, bitte einen <3>Github-Issue3> ausfüllen oder direkt mit uns Kontakt aufnehmen.4><5>Funding5><6>Dieser Spielserver wurde im Rahmen des Projekts <1>ADAM: Anticipating the Digital Age of Mathematics1> an der Heinrich-Heine-Universität Düsseldorf entwickelt. Es wird finanziell durch das Projekt Freiraum 2022 der Stiftung Innovation in der Hochschullehre unterstützt.6>",
+ "<0>Privacy Policy0>Our server collects metadata (such as IP address, browser, operating system) and the data that the user enters into the editor. The data is used to compute the Lean output and display it to the user. The information will be stored as long as the user stays on our website and will be deleted immediately afterwards. We keep logs to improve our software, but the contained data is anonymized.
We do not use cookies, but your game progress is stored in the browser as site data. Your game progress is not saved on the server; if you delete your browser storage, it is completely gone.
Our server is located in Germany.
<4>Contact: Marcus Zibrowius, Jon Eugster Mathematisches Institut der Heinrich-Heine-Universität Düsseldorf Universitätsstr. 1 40225 Düsseldorf Germany +49 211 81-14690 <14>Contact Details14>4>": "<0>Datenschutzerklärung0>Unser Server verarbeitet Benutzer-Metadaten (zum Beispiel IP-Addresse, Browser-Version, Betriebssystem) sowie die Benutzereingaben in den Editor. Diese Daten werden verwendet um die Lean-Ausgabe zu berechnen und dem Benutzer darzustellen. Die Informationen werden nur gespeichert, solange der Benutzer auf unserer Webseite bleibt und anschliessend sofort gelöscht. Wir führen Log-Dateien um die Software zu verbessern, aber die enthaltenen Daten sind anonymisiert.
Wir verwenden keine Cookies, aber der Spielstand wird im Browser als \"Site Data\" gespeichert. Der Spielstand wird nicht auf dem Server gespeichert; wird er lokal gelöscht, kann er nicht wiederhergestellt werden.
Unser Server ist in Deutschland stationiert.
<4>Kontakt: Markus Zibrowius, Jon Eugster Mathematisches Institut der Heinrich-Heine-Universität Düsseldorf Universitätsstr. 1 40225 Düsseldorf Deutschland +49 211 81-14690 <14>Kontaktdetails14>4>",
+ "home": "",
+ "close language menu": "Sprachmenü schließen",
+ "open language menu": "Sprachmenü öffnen",
+ "close menu": "Menü schließen",
+ "open menu": "Menü öffnen",
+ "Editor Mode": "",
+ "Typewriter Mode": ""
}
diff --git a/client/public/locales/en/translation.json b/client/public/locales/en/translation.json
index dfc34c7b..de54623e 100644
--- a/client/public/locales/en/translation.json
+++ b/client/public/locales/en/translation.json
@@ -10,33 +10,19 @@
"none": "none",
"Rules": "Rules",
"Intro": "Intro",
- "Game Introduction": "Game Introduction",
- "World selection": "World selection",
"Start": "Start",
- "Inventory": "Inventory",
- "next level": "next level",
"Next": "Next",
- "back to world selection": "back to world selection",
- "Leave World": "Leave World",
- "previous level": "previous level",
"Previous": "Previous",
"Editor mode is enforced!": "Editor mode is enforced!",
"Editor mode": "Editor mode",
"Typewriter mode": "Typewriter mode",
- "information, Impressum, privacy policy": "information, Impressum, privacy policy",
"Preferences": "Preferences",
- "Game Info & Credits": "Game Info & Credits",
"Game Info": "Game Info",
- "Clear Progress": "Clear Progress",
"Erase": "Erase",
- "Download Progress": "Download Progress",
"Download": "Download",
- "Load Progress from JSON": "Load Progress from JSON",
"Upload": "Upload",
"Home": "Home",
"back to games selection": "back to games selection",
- "close inventory": "close inventory",
- "show inventory": "show inventory",
"World": "World",
"Show more help!": "Show more help!",
"Goal": "Goal",
@@ -92,8 +78,18 @@
"Retry proof from here": "Retry proof from here",
"Retry": "Retry",
"Failed command": "Failed command",
- "As this server runs lean on our university machines, it has a limited capacity. Our current estimate is about 70 simultaneous games.
": "As this server runs lean on our university machines, it has a limited capacity. Our current estimate is about 70 simultaneous games.
",
- "<0>Most aspects of the games and the infrastructure are still in development. Feel free to file a <1>GitHub Issue1> about any problems you experience!0>": "<0>Most aspects of the games and the infrastructure are still in development. Feel free to file a <1>GitHub Issue1> about any problems you experience!0>",
- "This server has been developed as part of the project <1>ADAM: Anticipating the Digital Age of Mathematics1> at Heinrich Heine University Düsseldorf.": "This server has been developed as part of the project <1>ADAM: Anticipating the Digital Age of Mathematics1> at Heinrich Heine University Düsseldorf.",
- " used": " used"
+ "view the Lean game server on Github": "view the Lean game server on Github",
+ "Theorem": "Theorem",
+ "Impressum": "Impressum",
+ "Privacy Policy": "Privacy Policy",
+ "<0>Impressum0><1>Contact: Marcus Zibrowius, Jon Eugster Mathematisches Institut der Heinrich-Heine-Universität Düsseldorf Universitätsstr. 1 40225 Düsseldorf Germany +49 211 81-14690 <14>Contact Details14>1><2>Legal form: The Heinrich Heine University Düsseldorf is a corporation under public law. It is legally represented by the Rector Prof. Dr. Anja Steinbeck. The responsible supervisory authority is the Ministry of Culture and Science of North Rhine-Westphalia, Völklinger Straße 49, 40221 Düsseldorf.2><3>VAT identification number: according to §27a Sales Tax Act DE 8112224163><4><0>Impressum HHU0>4>": "<0>Impressum0><1>Contact: Marcus Zibrowius, Jon Eugster Mathematisches Institut der Heinrich-Heine-Universität Düsseldorf Universitätsstr. 1 40225 Düsseldorf Germany +49 211 81-14690 <14>Contact Details14>1><2>Legal form: The Heinrich Heine University Düsseldorf is a corporation under public law. It is legally represented by the Rector Prof. Dr. Anja Steinbeck. The responsible supervisory authority is the Ministry of Culture and Science of North Rhine-Westphalia, Völklinger Straße 49, 40221 Düsseldorf.2><3>VAT identification number: according to §27a Sales Tax Act DE 8112224163><4><0>Impressum HHU0>4>",
+ "<0>Progress saving0><1>The game stores your progress in your local browser storage. If you delete it, your progress will be lost! Warning: In most browsers, deleting cookies will also clear the local storage (or \"local site data\"). Make sure to download your game progress first!1><2>Development2><3>The game engine has been created by Alexander Bentkamp , Jon Eugster . On a prototype by Patrick Massot .3><4>The source code of this Lean game engine is <1>available on Github1>. If you experience any problems, please file an <3>Issue on Github3> or get directly in contact.4><5>Funding5><6>The game engine has been developed as part of the project <1>ADAM: Anticipating the Digital Age of Mathematics1> at Heinrich-Heine-Universität Düsseldorf. It is funded by the Stiftung Innovation in der Hochschullehre as part of project Freiraum 2022 .6>": "<0>Progress saving0><1>The game stores your progress in your local browser storage. If you delete it, your progress will be lost! Warning: In most browsers, deleting cookies will also clear the local storage (or \"local site data\"). Make sure to download your game progress first!1><2>Development2><3>The game engine has been created by Alexander Bentkamp , Jon Eugster . On a prototype by Patrick Massot .3><4>The source code of this Lean game engine is <1>available on Github1>. If you experience any problems, please file an <3>Issue on Github3> or get directly in contact.4><5>Funding5><6>The game engine has been developed as part of the project <1>ADAM: Anticipating the Digital Age of Mathematics1> at Heinrich-Heine-Universität Düsseldorf. It is funded by the Stiftung Innovation in der Hochschullehre as part of project Freiraum 2022 .6>",
+ "<0>Privacy Policy0>Our server collects metadata (such as IP address, browser, operating system) and the data that the user enters into the editor. The data is used to compute the Lean output and display it to the user. The information will be stored as long as the user stays on our website and will be deleted immediately afterwards. We keep logs to improve our software, but the contained data is anonymized.
We do not use cookies, but your game progress is stored in the browser as site data. Your game progress is not saved on the server; if you delete your browser storage, it is completely gone.
Our server is located in Germany.
<4>Contact: Marcus Zibrowius, Jon Eugster Mathematisches Institut der Heinrich-Heine-Universität Düsseldorf Universitätsstr. 1 40225 Düsseldorf Germany +49 211 81-14690 <14>Contact Details14>4>": "<0>Privacy Policy0>Our server collects metadata (such as IP address, browser, operating system) and the data that the user enters into the editor. The data is used to compute the Lean output and display it to the user. The information will be stored as long as the user stays on our website and will be deleted immediately afterwards. We keep logs to improve our software, but the contained data is anonymized.
We do not use cookies, but your game progress is stored in the browser as site data. Your game progress is not saved on the server; if you delete your browser storage, it is completely gone.
Our server is located in Germany.
<4>Contact: Marcus Zibrowius, Jon Eugster Mathematisches Institut der Heinrich-Heine-Universität Düsseldorf Universitätsstr. 1 40225 Düsseldorf Germany +49 211 81-14690 <14>Contact Details14>4>",
+ "home": "home",
+ "close language menu": "close language menu",
+ "open language menu": "open language menu",
+ "close menu": "close menu",
+ "open menu": "open menu",
+ "Editor Mode": "Editor Mode",
+ "Typewriter Mode": "Typewriter Mode"
}
diff --git a/client/public/locales/es/translation.json b/client/public/locales/es/translation.json
index 2200246d..c1283eca 100644
--- a/client/public/locales/es/translation.json
+++ b/client/public/locales/es/translation.json
@@ -1,99 +1,95 @@
{
- "Intro": "Introducción",
- "Game Introduction": "Introducción del juego",
- "World selection": "Seleccionar mundo",
- "Start": "Empezar",
- "Inventory": "Inventario",
- "next level": "siguiente nivel",
- "Next": "Siguiente",
- "back to world selection": "volver a la selección de mundos",
- "Leave World": "Abandonar mundo",
- "previous level": "nivel anterior",
- "Previous": "Anterior",
- "Editor mode is enforced!": "¡El modo editor es obligatorio!",
- "Editor mode": "Modo editor",
- "Typewriter mode": "Modo línea a línea",
- "information, Impressum, privacy policy": "información, Impressum, política de privacidad",
- "Preferences": "Preferencias",
- "Game Info & Credits": "Información del juego y reconocimientos",
- "Game Info": "Información del juego",
- "Clear Progress": "Limpiar el progreso",
- "Erase": "Borrar",
- "Download Progress": "Descargar progreso",
- "Download": "Descargar",
- "Load Progress from JSON": "Cargar progreso desde JSON",
- "Upload": "Subir",
- "Home": "Inicio",
- "back to games selection": "volver a la selección de juegos",
- "close inventory": "cerrar inventario",
- "show inventory": "mostrar inventario",
- "World": "Mundo",
- "Show more help!": "¡Mostrar más ayuda!",
- "Goal": "Objetivo",
- "Objects": "Objetos",
- "Assumptions": "Hipótesis",
- "Current Goal": "Objetivo actual",
- "Further Goals": "Objetivos pendientes",
- "No Goals": "Sin objetivos",
- "Loading goal…": "Cargando objetivo…",
- "Click somewhere in the Lean file to enable the infoview.": "Pulsa en algún lugar del archivo Lean para habilitar la vista de información.",
- "Waiting for Lean server to start…": "Esperando a que el servidor Lean se inicie…",
- "Level completed! 🎉": "Nivel completado 🎉",
- "Level completed with warnings 🎭": "Nivel completado con advertencias 🎭",
- "Failed command": "Comando fallido",
- "Retry proof from here": "Reintentar la prueba desde aquí",
- "Retry": "Reintentar",
- "Active Goal": "Objetivo activo",
- "Crashed! Go to editor mode and fix your proof! Last server response:": "¡Error! Vaya al modo editor y corrija su prueba. Última respuesta del servidor:",
- "Line": "Línea",
- "Character": "Carácter",
- "Loading messages…": "Cargando mensajes…",
- "Execute": "Ejecutar",
- "Tactics": "Tácticas",
- "Definitions": "Definiciones",
- "Theorems": "Teoremas",
- "Not unlocked yet": "No desbloqueado aún",
- "Not available in this level": "No disponible en este nivel",
- "A repository of learning games for the proof assistant <1>Lean1> (Lean 4) and its mathematical library <5>mathlib5>": "Un repositorio de juegos para aprender el asistente de demostración <1>Lean1>, (Lean 4) y su biblioteca matemática <5>mathlib5> ",
- "No Games loaded. Use <1>http://localhost:3000/#/g/local/FOLDER1> to open a game directly from a local folder.": "No se ha cargado ningún juego. Use <1>http://localhost:3000/#/g/local/FOLDER1> para abrir un juego directamente desde una carpeta local",
- "<0>If you are considering writing your own game, you should use the <1>GameSkeleton Github Repo1> as a template and read <3>How to Create a Game3>.0><1>You can directly load your games into the server and play it using the correct URL. The <1>instructions above1> also explain the details for how to load your game to the server. We'd like to encourage you to contact us if you have any questions.1>Featured games on this page are added manually. Please get in contact and we'll happily add yours.
": "<0>Si está considerando escribir su propio juego, use el <1>GameSkeleton Github Repo1> como plantilla y lea <3>How to Create a Game3>.0><1>Puede cargar directamente los juegos en el servidor y jugarlo usando la URL adecuada. Las <1>instrucciones anteriores1> también explican los detalles sobre cómo cargar su juego en el servidor. Le animamos a ponerse en contacto con nosotros si tiene preguntas.1>Los juegos incluidos en esta página son añadidos manualmente. Por favor, contactenos y añadiremos el suyo encantados.
",
- "Prerequisites": "Requisitos previos",
- "Worlds": "Mundos",
- "Levels": "Niveles",
- "Language": "Idioma",
- "Lean Game Server": "Servidor de Juegos de Lean",
- "Development notes": "Notas de desarrollo",
- "Adding new games": "Añadir nuevos juegos",
- "Funding": "Financiación",
- "Level": "Nivel",
- "Introduction": "Introducción",
- "Do you want to delete your saved progress irreversibly?
(This deletes your proofs and your collected inventory. Saves from other games are not deleted.)
": "¿Desea eliminar su progreso guardado definitivamente?
(Esto elimina sus pruebas y su inventario recopilado. Los progresos guardados de otros juegos no se eliminan.)
",
- "Delete Progress?": "¿Borrar Progreso?",
- "Delete": "Borrar",
- "Download & Delete": "Descargar y Borrar",
- "Cancel": "Cancelar",
- "Mobile": "Móvil",
- "Auto": "Automático",
- "Desktop": "Escritorio",
- "Layout": "Diseño",
- "Always visible": "Siempre visible",
- "Save my settings (in the browser store)": "Guardar mis ajustes (en el almacenamiento del navegador)",
- "Game rules determine if it is allowed to skip levels and if the games runs checks to only allow unlocked tactics and theorems in proofs.
<1>Note: \"Unlocked\" tactics (or theorems) are determined by two things: The set of minimal tactics needed to solve a level, plus any tactics you unlocked in another level. That means if you unlock <1>simp1> in a level, you can use it henceforth in any level.1>The options are:
": "Las reglas del juego determinan si se permite saltarse niveles y si el juego realiza comprobaciones para permitir únicamente tácticas y teoremas desbloqueados en las pruebas.
<1>Nota: las tácticas (o teoremas) \"Desbloqueadas\" está determinadas por dos cosas: el conjunto mínimo de tácticas necesarias para resolver un nivel, más cualquier táctica que hayas desbloqueado en otro nivel. Esto significa que si desbloqueas <1>simp1> en un nivel, puedes usarlo a partir de entonces en cualquier nivel.1>Las opciones son:
",
- "Game Rules": "Reglas del juego",
- "levels": "niveles",
- "tactics": "tácticas",
- "regular": "normal",
- "relaxed": "relajado",
- "none": "ninguno",
- "Select a JSON file with the saved game progress to load your progress.
<1><0>Warning:0> This will delete your current game progress! Consider <2>downloading your current progress2> first!1>": "Seleccione un archivo JSON con el progreso del juego guardado para cargar su progreso.
<1><0>Advertencia:0> Esto borrará su progreso actual en el juego. Considere <2>descargar su progreso actual2> antes1>",
- "Upload Saved Progress": "Subir progreso guardado",
- "Load selected file": "Cargar archivo seleccionado",
- "Rules": "Reglas",
- "As this server runs lean on our university machines, it has a limited capacity. Our current estimate is about 70 simultaneous games.
": "Como este servidor corre en máquinas de nuestra universidad, tiene una capacidad limitada. Nuestra estimación actual es de unos 70 juegos simultaneos.
.",
- "<0>Most aspects of the games and the infrastructure are still in development. Feel free to file a <1>GitHub Issue1> about any problems you experience!0>": "<1>Muchos aspectos de los juegos y la infrastructura están aún en desarrollo. No dude en abrir una <1>GitHub Issue1> sobre cualquier problema que experimente.1>",
- "This server has been developed as part of the project <1>ADAM: Anticipating the Digital Age of Mathematics1> at Heinrich Heine University Düsseldorf.": "Este servidor se ha desarrollado como parte del proyecto <1>ADAM: Anticipating the Digital Age of Mathematics1> en la Heinrich-Heine-Universität de Düsseldorf.",
- "Server capacity": "",
- "RAM": "",
- " used": "",
- "CPU": ""
+ "Intro": "",
+ "Game Introduction": "",
+ "World selection": "",
+ "Start": "",
+ "Inventory": "",
+ "next level": "",
+ "Next": "",
+ "back to world selection": "",
+ "Leave World": "",
+ "previous level": "",
+ "Previous": "",
+ "Editor mode is enforced!": "",
+ "Editor mode": "",
+ "Typewriter mode": "",
+ "information, Impressum, privacy policy": "",
+ "Preferences": "",
+ "Game Info & Credits": "",
+ "Game Info": "",
+ "Clear Progress": "",
+ "Erase": "",
+ "Download Progress": "",
+ "Download": "",
+ "Load Progress from JSON": "",
+ "Upload": "",
+ "Home": "",
+ "back to games selection": "",
+ "close inventory": "",
+ "show inventory": "",
+ "World": "",
+ "Show more help!": "",
+ "Goal": "",
+ "Objects": "",
+ "Assumptions": "",
+ "Current Goal": "",
+ "Further Goals": "",
+ "No Goals": "",
+ "Loading goal…": "",
+ "Click somewhere in the Lean file to enable the infoview.": "",
+ "Waiting for Lean server to start…": "",
+ "Level completed! 🎉": "",
+ "Level completed with warnings 🎭": "",
+ "Failed command": "",
+ "Retry proof from here": "",
+ "Retry": "",
+ "Active Goal": "",
+ "Crashed! Go to editor mode and fix your proof! Last server response:": "",
+ "Line": "",
+ "Character": "",
+ "Loading messages…": "",
+ "Execute": "",
+ "Tactics": "",
+ "Definitions": "",
+ "Theorems": "",
+ "Not unlocked yet": "",
+ "Not available in this level": "",
+ "A repository of learning games for the proof assistant <1>Lean1> (Lean 4) and its mathematical library <5>mathlib5>": "",
+ "No Games loaded. Use <1>http://localhost:3000/#/g/local/FOLDER1> to open a game directly from a local folder.": "",
+ "As this server runs lean on our university machines, it has a limited capacity. Our current estimate is about 70 simultaneous games. We hope to address and test this limitation better in the future.
<1>Most aspects of the games and the infrastructure are still in development. Feel free to file a <1>GitHub Issue1> about any problems you experience!1>": "",
+ "<0>If you are considering writing your own game, you should use the <1>GameSkeleton Github Repo1> as a template and read <3>How to Create a Game3>.0><1>You can directly load your games into the server and play it using the correct URL. The <1>instructions above1> also explain the details for how to load your game to the server. We'd like to encourage you to contact us if you have any questions.1>Featured games on this page are added manually. Please get in contact and we'll happily add yours.
": "",
+ "This server has been developed as part of the project <1>ADAM : Anticipating the Digital Age of Mathematics1> at Heinrich-Heine-Universität in Düsseldorf.": "",
+ "view the Lean game server on Github": "",
+ "Prerequisites": "",
+ "Worlds": "",
+ "Levels": "",
+ "Language": "",
+ "Lean Game Server": "",
+ "Development notes": "",
+ "Adding new games": "",
+ "Funding": "",
+ "Level": "",
+ "Introduction": "",
+ "Do you want to delete your saved progress irreversibly?
(This deletes your proofs and your collected inventory. Saves from other games are not deleted.)
": "",
+ "Delete Progress?": "",
+ "Delete": "",
+ "Download & Delete": "",
+ "Cancel": "",
+ "Mobile": "",
+ "Auto": "",
+ "Desktop": "",
+ "Layout": "",
+ "Always visible": "",
+ "Save my settings (in the browser store)": "",
+ "Game rules determine if it is allowed to skip levels and if the games runs checks to only allow unlocked tactics and theorems in proofs.
<1>Note: \"Unlocked\" tactics (or theorems) are determined by two things: The set of minimal tactics needed to solve a level, plus any tactics you unlocked in another level. That means if you unlock <1>simp1> in a level, you can use it henceforth in any level.1>The options are:
": "",
+ "Game Rules": "",
+ "levels": "",
+ "tactics": "",
+ "regular": "",
+ "relaxed": "",
+ "none": "",
+ "Select a JSON file with the saved game progress to load your progress.
<1><0>Warning:0> This will delete your current game progress! Consider <2>downloading your current progress2> first!1>": "",
+ "Upload Saved Progress": "",
+ "Load selected file": "",
+ "Rules": ""
}
diff --git a/client/public/locales/zh/translation.json b/client/public/locales/zh/translation.json
index 71cabdd2..69637d53 100644
--- a/client/public/locales/zh/translation.json
+++ b/client/public/locales/zh/translation.json
@@ -1,7 +1,7 @@
{
"Tactics": "策略",
- "Lean Game Server": "LEAN 游戏服务器",
- "Game rules determine if it is allowed to skip levels and if the games runs checks to only allow unlocked tactics and theorems in proofs.
<1>Note: \"Unlocked\" tactics (or theorems) are determined by two things: The set of minimal tactics needed to solve a level, plus any tactics you unlocked in another level. That means if you unlock <1>simp1> in a level, you can use it henceforth in any level.1>The options are:
": "游戏规则决定是否允许跳过关卡,以及游戏是否只允许在证明中使用已解锁的策略和定理。
<1>注意:“解锁”的策略(或定理)由两个因素决定:解决关卡所需的最小策略集合,加上你在其他关卡中解锁的任何策略。这意味着,如果你在某个关卡中解锁了<1>simp1>,你可以在任何关卡中使用它。1>选项有:
",
+ "Lean Game Server": "Lean游戏服务器",
+ "Game rules determine if it is allowed to skip levels and if the games runs checks to only allow unlocked tactics and theorems in proofs.
<1>Note: \"Unlocked\" tactics (or theorems) are determined by two things: The set of minimal tactics needed to solve a level, plus any tactics you unlocked in another level. That means if you unlock <1>simp1> in a level, you can use it henceforth in any level.1>The options are:
": "游戏规则决定是否允许跳过关卡,以及游戏是否允许在证明中使用未解锁的策略和定理。
<1>注意:“解锁”的策略(或定理)由两个因素决定:解决关卡所需的最小策略集合,加上你在另一个关卡中解锁的任何策略。这意味着,如果你在某个关卡中解锁了<1>simp1>,那么你可以在任何关卡中使用它。1>
选项是:
",
"Game Rules": "游戏规则",
"levels": "关卡",
"tactics": "策略",
@@ -23,7 +23,6 @@
"Editor mode is enforced!": "编辑器模式已启用!",
"Editor mode": "编辑器模式",
"Typewriter mode": "打字机模式",
- "information, Impressum, privacy policy": "信息、版权说明、隐私政策",
"Preferences": "偏好设置",
"Game Info & Credits": "游戏信息和荣誉",
"Game Info": "游戏信息",
@@ -59,27 +58,30 @@
"Execute": "执行",
"Definitions": "定义",
"Theorems": "定理",
+ "Theorem": "定理",
"Not unlocked yet": "尚未解锁",
"Not available in this level": "本关卡不提供",
- "A repository of learning games for the proof assistant <1>Lean1> (Lean 4) and its mathematical library <5>mathlib5>": "这是一个为证明助手 <1>Lean1> (Lean 4) 及其数学库 <5>mathlib5> 设计的学习游戏库",
- "No Games loaded. Use <1>http://localhost:3000/#/g/local/FOLDER1> to open a game directly from a local folder.": "未加载游戏。访问 <1>http://localhost:3000/#/g/local/FOLDER1> 从本地文件夹打开游戏。",
- "<0>If you are considering writing your own game, you should use the <1>GameSkeleton Github Repo1> as a template and read <3>How to Create a Game3>.0><1>You can directly load your games into the server and play it using the correct URL. The <1>instructions above1> also explain the details for how to load your game to the server. We'd like to encourage you to contact us if you have any questions.1>Featured games on this page are added manually. Please get in contact and we'll happily add yours.
": "<0>如果你打算编写自己的游戏,可以使用 <1>GameSkeleton Github Repo1> 作为模板,并参阅 <3>如何创建游戏3>。0><1>你可以直接将游戏上传至服务器,并通过正确的 URL 进行游戏。上面的 <1>说明1> 已详细介绍了如何将游戏加载到服务器的步骤。如果你有任何疑问,请随时联系我们。1>本页上的精选游戏都是手动添加的。如果你想添加你的游戏,请与我们联系,我们非常欢迎。
",
+ "A repository of learning games for the proof assistant <1>Lean1> (Lean 4) and its mathematical library <5>mathlib5>": "一个用于<1>Lean1> (Lean 4) 及其数学库<5>mathlib5>的学习游戏库",
+ "No Games loaded. Use <1>http://localhost:3000/#/g/local/FOLDER1> to open a game directly from a local folder.": "没有加载游戏。使用<1>http://localhost:3000/#/g/local/FOLDER1>直接从本地文件夹打开游戏。",
+ "As this server runs lean on our university machines, it has a limited capacity. Our current estimate is about 70 simultaneous games. We hope to address and test this limitation better in the future.
<1>Most aspects of the games and the infrastructure are still in development. Feel free to file a <1>GitHub Issue1> about any problems you experience!1>": "由于这个服务器在我们大学的机器上运行Lean,它的容量是有限的。我们当前的估计是大约70个同时进行的游戏。我们希望将来能更好地解决和测试这个限制。
<1>游戏和基础设施的大多数方面仍在开发中。遇到任何问题,请随时提交<1>GitHub Issue1>!1>",
+ "<0>If you are considering writing your own game, you should use the <1>GameSkeleton Github Repo1> as a template and read <3>How to Create a Game3>.0><1>You can directly load your games into the server and play it using the correct URL. The <1>instructions above1> also explain the details for how to load your game to the server. We'd like to encourage you to contact us if you have any questions.1>Featured games on this page are added manually. Please get in contact and we'll happily add yours.
": "<0>如果您想编写自己的游戏,您应该使用<1>GameSkeleton Github Repo1>作为模板,并阅读<3>如何创建游戏3>。0><1>您可以直接将游戏加载到服务器上并使用正确的URL进行游戏。上面的<1>说明1>也解释了如何将游戏加载到服务器的详细步骤。如果您有任何疑问,请您与我们联系。1>本页面上的游戏是手动添加的。请与我们联系,我们很乐意添加您的游戏。
",
+ "This server has been developed as part of the project <1>ADAM : Anticipating the Digital Age of Mathematics1> at Heinrich-Heine-Universität in Düsseldorf.": "这个服务器是作为杜塞尔多夫海因里希·海涅大学项目<1>ADAM:预见数学的数字时代1>的一部分而开发的。",
"Prerequisites": "前置条件",
"Worlds": "世界",
"Levels": "关卡",
"Language": "语言",
- "Development notes": "开发笔记",
+ "Development notes": "开发信息",
"Adding new games": "添加新游戏",
- "Funding": "资助",
- "Do you want to delete your saved progress irreversibly?
(This deletes your proofs and your collected inventory. Saves from other games are not deleted.)
": "您确定要永久删除您的游戏进度吗?
(此操作将删除您的所有证明和收集的定理与策略,但不会影响其他游戏的保存数据。)
",
+ "Funding": "赞助",
+ "Do you want to delete your saved progress irreversibly?
(This deletes your proofs and your collected inventory. Saves from other games are not deleted.)
": "您是否想要不可逆转地删除您的游戏进度?
(这将删除您的证明和您收集的定理和策略。其他游戏的进度不会被删除。)
",
"Delete Progress?": "删除进度?",
"Delete": "删除",
"Download & Delete": "下载和删除",
"Cancel": "取消",
"Layout": "布局",
"Always visible": "始终可见",
- "Save my settings (in the browser store)": "保存我的设置(在浏览器中存储)",
- "Select a JSON file with the saved game progress to load your progress.
<1><0>Warning:0> This will delete your current game progress! Consider <2>downloading your current progress2> first!1>": "选择一个包含已保存游戏进度的 JSON 文件来加载您的进度。
<1><0>警告:0>这将删除您当前的游戏进度!请考虑先<2>下载您当前的进度2>!1>",
+ "Save my settings (in the browser store)": "保存我的设置(在浏览器商店中)",
+ "Select a JSON file with the saved game progress to load your progress.
<1><0>Warning:0> This will delete your current game progress! Consider <2>downloading your current progress2> first!1>": "选择一个包含已保存游戏进度的JSON文件来加载您的进度。
<1><0>警告:0>这将删除您当前的游戏进度!首先考虑<2>下载您当前的进度2>!1>",
"Upload Saved Progress": "上传保存的进度",
"Load selected file": "加载所选文件",
"Mobile": "移动端",
@@ -89,11 +91,10 @@
"Introduction": "介绍",
"Retry": "重试",
"Failed command": "命令失败",
- "As this server runs lean on our university machines, it has a limited capacity. Our current estimate is about 70 simultaneous games.
": "",
- "<0>Most aspects of the games and the infrastructure are still in development. Feel free to file a <1>GitHub Issue1> about any problems you experience!0>": "",
- "This server has been developed as part of the project <1>ADAM: Anticipating the Digital Age of Mathematics1> at Heinrich Heine University Düsseldorf.": "",
- "Server capacity": "",
- "RAM": "",
- " used": "",
- "CPU": ""
+ "view the Lean game server on Github": "",
+ "Impressum": "版权声明",
+ "Privacy Policy": "隐私政策",
+ "<0>Impressum0><1>Contact: Marcus Zibrowius, Jon Eugster Mathematisches Institut der Heinrich-Heine-Universität Düsseldorf Universitätsstr. 1 40225 Düsseldorf Germany +49 211 81-14690 <14>Contact Details14>1><2>Legal form: The Heinrich Heine University Düsseldorf is a corporation under public law. It is legally represented by the Rector Prof. Dr. Anja Steinbeck. The responsible supervisory authority is the Ministry of Culture and Science of North Rhine-Westphalia, Völklinger Straße 49, 40221 Düsseldorf.2><3>VAT identification number: according to §27a Sales Tax Act DE 8112224163><4><0>Impressum HHU0>4>": "",
+ "<0>Progress saving0><1>The game stores your progress in your local browser storage. If you delete it, your progress will be lost! Warning: In most browsers, deleting cookies will also clear the local storage (or \"local site data\"). Make sure to download your game progress first!1><2>Development2><3>The game engine has been created by Alexander Bentkamp , Jon Eugster . On a prototype by Patrick Massot .3><4>The source code of this Lean game engine is <1>available on Github1>. If you experience any problems, please file an <3>Issue on Github3> or get directly in contact.4><5>Funding5><6>The game engine has been developed as part of the project <1>ADAM: Anticipating the Digital Age of Mathematics1> at Heinrich-Heine-Universität Düsseldorf. It is funded by the Stiftung Innovation in der Hochschullehre as part of project Freiraum 2022 .6>": "",
+ "<0>Privacy Policy0>Our server collects metadata (such as IP address, browser, operating system) and the data that the user enters into the editor. The data is used to compute the Lean output and display it to the user. The information will be stored as long as the user stays on our website and will be deleted immediately afterwards. We keep logs to improve our software, but the contained data is anonymized.
We do not use cookies, but your game progress is stored in the browser as site data. Your game progress is not saved on the server; if you delete your browser storage, it is completely gone.
Our server is located in Germany.
<4>Contact: Marcus Zibrowius, Jon Eugster Mathematisches Institut der Heinrich-Heine-Universität Düsseldorf Universitätsstr. 1 40225 Düsseldorf Germany +49 211 81-14690 <14>Contact Details14>4>": ""
}
diff --git a/client/src/app.tsx b/client/src/app.tsx
index 42c55312..e5e60cc4 100644
--- a/client/src/app.tsx
+++ b/client/src/app.tsx
@@ -1,5 +1,6 @@
import * as React from 'react';
-import { Outlet, useParams } from "react-router-dom";
+import { Outlet, useParams, useSearchParams } from "react-router-dom";
+import { Suspense, useEffect, useState } from 'react';
import '@fontsource/roboto/300.css';
import '@fontsource/roboto/400.css';
@@ -8,31 +9,101 @@ import '@fontsource/roboto/700.css';
import './css/reset.css';
import './css/app.css';
-import { PreferencesContext} from './components/infoview/context';
+import { GameIdContext, PageContext, PreferencesContext} from './state/context';
import UsePreferences from "./state/hooks/use_preferences"
-import i18n from './i18n';
-
-export const GameIdContext = React.createContext(undefined);
+import { Navigation } from './components/navigation';
+import { useSelector } from 'react-redux';
+import { changeTypewriterMode, selectReadIntro, selectTypewriterMode } from './state/progress';
+import { useAppDispatch } from './hooks';
+import { Popup, PopupContext } from './components/popup/popup';
+import { useGetGameInfoQuery } from './state/api';
+import lean4gameConfig from './config.json'
+import { useTranslation } from 'react-i18next';
function App() {
+ let { t, i18n } = useTranslation()
const params = useParams()
- const gameId = "g/" + params.owner + "/" + params.repo
+ const gameId = (params.owner && params.repo) ? "g/" + params.owner + "/" + params.repo : null
+ const worldId = params.worldId
+ const levelId = parseInt(params.levelId)
const {mobile, layout, isSavePreferences, language, setLayout, setIsSavePreferences, setLanguage} = UsePreferences()
- React.useEffect(() => {
- i18n.changeLanguage(language)
- }, [language])
+ const dispatch = useAppDispatch()
+ const typewriterMode = useSelector(selectTypewriterMode(gameId))
+ const setTypewriterMode = (newTypewriterMode: boolean) => dispatch(changeTypewriterMode({game: gameId, typewriterMode: newTypewriterMode}))
+ const [lockEditorMode, setLockEditorMode] = useState(false)
+ const [typewriterInput, setTypewriterInput] = useState("")
+ const [page, setPage] = useState(0)
+ const [popupContent, setPopupContent] = useState(null)
+ const gameInfo = useGetGameInfoQuery({game: gameId})
+ const [searchParams, setSearchParams] = useSearchParams()
+
+ const readIntro = useSelector(selectReadIntro(gameId, worldId))
+
+ // mobile only: game intro should only be shown once and skipped afterwards
+ useEffect(() => {
+ if (worldId) {
+ console.log('setting page to 1')
+ setPage(1)
+ } else {
+ if (readIntro && page == 0) {
+ console.log('setting page to 1')
+ setPage(1)
+ } else {
+ // setPage(0)
+ }
+ }
+ }, [worldId, levelId])
+
+ // option to pass language as `?lang=de` in the URL
+ useEffect(() => {
+ let urlLang = searchParams.get("lang")
+ let availableLangs = gameInfo?.data?.tile?.languages
+ if (gameId) {
+ if (availableLangs?.includes(urlLang)) {
+ setLanguage(urlLang)
+ // Delete the search param as we processed it.
+ searchParams.delete('lang')
+ setSearchParams(searchParams)
+ }
+ } else {
+ if (urlLang in lean4gameConfig.languages) {
+ setLanguage(urlLang)
+ // Delete the search param as we processed it.
+ searchParams.delete('lang')
+ setSearchParams(searchParams)
+ }
+ }
+ }, [gameId, gameInfo?.data?.tile?.languages])
+
+ // set the correct language
+ useEffect(() => {
+let availableLangs = gameInfo.data?.tile?.languages
+ if (gameId && availableLangs?.length > 0 && !(availableLangs.includes(language))) {
+ // if the game is not available in the preferred language, display it in the original
+ // language
+ console.debug(`using default language: ${availableLangs[0]}`)
+ i18n.changeLanguage(availableLangs[0])
+ } else {
+ console.debug(`using language: ${language}`)
+ i18n.changeLanguage(language)
+ }
+ }, [gameId, gameInfo?.data?.tile?.languages, language])
return (
-
-
-
+
+
+
+
+
-
-
+ { popupContent && }
+
+
+
)
diff --git a/client/src/components/app_bar.tsx b/client/src/components/app_bar.tsx
deleted file mode 100644
index 37d55dd0..00000000
--- a/client/src/components/app_bar.tsx
+++ /dev/null
@@ -1,311 +0,0 @@
-/**
- * @file contains the navigation bars of the app.
- */
-import * as React from 'react'
-import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
-import { faDownload, faUpload, faEraser, faBook, faBookOpen, faGlobe, faHome,
- faArrowRight, faArrowLeft, faXmark, faBars, faCode,
- faCircleInfo, faTerminal, faGear } from '@fortawesome/free-solid-svg-icons'
-import { GameIdContext } from "../app"
-import { InputModeContext, PreferencesContext, WorldLevelIdContext } from "./infoview/context"
-import { GameInfo, useGetGameInfoQuery } from '../state/api'
-import { changedOpenedIntro, selectCompleted, selectDifficulty, selectProgress } from '../state/progress'
-import { useAppDispatch, useAppSelector } from '../hooks'
-import { Button } from './button'
-import { downloadProgress } from './popup/erase'
-import { useTranslation } from 'react-i18next'
-
-/** navigation buttons for mobile welcome page to switch between intro/tree/inventory. */
-function MobileNavButtons({pageNumber, setPageNumber}:
- { pageNumber: number,
- setPageNumber: any}) {
- const gameId = React.useContext(GameIdContext)
- const { t } = useTranslation()
- const dispatch = useAppDispatch()
-
- // if `prevText` or `prevIcon` is set, show a button to go back
- let prevText = {0: null, 1: t("Intro"), 2: null}[pageNumber]
- let prevIcon = {0: null, 1: null, 2: faBookOpen}[pageNumber]
- let prevTitle = {0: null, 1: t("Game Introduction"), 2: t("World selection")}[pageNumber]
- // if `nextText` or `nextIcon` is set, show a button to go forward
- let nextText = {0: t("Start"), 1: null, 2: null}[pageNumber]
- let nextIcon = {0: null, 1: faBook, 2: null}[pageNumber]
- let nextTitle = {0: t("World selection"), 1: t("Inventory"), 2: null}[pageNumber]
-
- return <>
- {(prevText || prevIcon) &&
- {pageNumber == 0 ? null : setPageNumber(pageNumber - 1)}}>
- {prevIcon && }
- {prevText && `${prevText}`}
-
- }
- {(nextText || nextIcon) &&
- {
- console.log(`page number: ${pageNumber}`)
- setPageNumber(pageNumber+1);
- dispatch(changedOpenedIntro({game: gameId, openedIntro: true}))}}>
- {nextText && `${nextText}`}
- {nextIcon && }
-
- }
- >
-}
-
-/** button to toggle dropdown menu. */
-export function MenuButton({navOpen, setNavOpen}) {
- return
-}
-
-/** button to go one level futher.
- * for the last level, this button turns into a button going back to the welcome page.
- */
-function NextButton({worldSize, difficulty, completed, setNavOpen}) {
- const { t } = useTranslation()
- const gameId = React.useContext(GameIdContext)
- const {worldId, levelId} = React.useContext(WorldLevelIdContext)
- return (levelId < worldSize ?
- = 2 && !(completed || levelId == 0)}
- onClick={() => setNavOpen(false)}>
- {levelId ? t("Next") : t("Start")}
-
- :
-
- {t("Leave World")}
-
- )
-}
-
-/** button to go one level back.
- * only renders if the current level id is > 0.
- */
-function PreviousButton({setNavOpen}) {
- const { t } = useTranslation()
- const gameId = React.useContext(GameIdContext)
- const {worldId, levelId} = React.useContext(WorldLevelIdContext)
- return (levelId > 0 && <>
- setNavOpen(false)}>
- {t("Previous")}
-
- >)
-}
-
-/** button to toggle between editor and typewriter */
-function InputModeButton({setNavOpen, isDropdown}) {
- const { t } = useTranslation()
- const {levelId} = React.useContext(WorldLevelIdContext)
- const {typewriterMode, setTypewriterMode, lockEditorMode} = React.useContext(InputModeContext)
-
- /** toggle input mode if allowed */
- function toggleInputMode(ev: React.MouseEvent) {
- if (!lockEditorMode){
- setTypewriterMode(!typewriterMode)
- setNavOpen(false)
- }
- }
-
- return toggleInputMode(ev)}
- title={lockEditorMode ? t("Editor mode is enforced!") : typewriterMode ? t("Editor mode") : t("Typewriter mode")}>
-
- {isDropdown && ((typewriterMode && !lockEditorMode) ? <> {t("Editor mode")}> : <> {t("Typewriter mode")}>)}
-
-}
-
-/** button to toggle iimpressum popup
- *
- * Note: Do not translate the word "Impressum"! German GDPR needs this.
-*/
-export function ImpressumButton({setNavOpen, toggleImpressum, isDropdown}) {
- const { t } = useTranslation()
- return {toggleImpressum(ev); setNavOpen(false)}}>
-
- {isDropdown && <> Impressum>}
-
-}
-
-export function PreferencesButton({setNavOpen, togglePreferencesPopup}) {
- const { t } = useTranslation()
- return {togglePreferencesPopup(); setNavOpen(false)}}>
- {t("Preferences")}
-
-}
-
-function GameInfoButton({setNavOpen, toggleInfo}) {
- const { t } = useTranslation()
- return {toggleInfo(); setNavOpen(false)}}>
- {t("Game Info")}
-
-}
-
-function EraseButton ({setNavOpen, toggleEraseMenu}) {
- const { t } = useTranslation()
- return {toggleEraseMenu(); setNavOpen(false)}}>
- {t("Erase")}
-
-}
-
-function DownloadButton ({setNavOpen, gameId, gameProgress}) {
- const { t } = useTranslation()
- return {downloadProgress(gameId, gameProgress, ev); setNavOpen(false)}}>
- {t("Download")}
-
-}
-
-function UploadButton ({setNavOpen, toggleUploadMenu}) {
- const { t } = useTranslation()
- return {toggleUploadMenu(); setNavOpen(false)}}>
- {t("Upload")}
-
-}
-
-/** button to go back to welcome page */
-function HomeButton({isDropdown}) {
- const { t } = useTranslation()
- const gameId = React.useContext(GameIdContext)
- return
-
- {isDropdown && <> {t("Home")}>}
-
-}
-
-function LandingPageButton() {
- const { t } = useTranslation()
- return
-
-
-}
-
-/** button in mobile level to toggle inventory.
- * only displays a button if `setPageNumber` is set.
- */
-function InventoryButton({pageNumber, setPageNumber}) {
- const { t } = useTranslation()
- return (setPageNumber &&
- {setPageNumber(pageNumber ? 0 : 1)}}>
-
-
- )
-}
-
-/** the navigation bar on the welcome page */
-export function WelcomeAppBar({pageNumber, setPageNumber, gameInfo, toggleImpressum, toggleEraseMenu, toggleUploadMenu, toggleInfo, togglePreferencesPopup} : {
- pageNumber: number,
- setPageNumber: any,
- gameInfo: GameInfo,
- toggleImpressum: any,
- toggleEraseMenu: any,
- toggleUploadMenu: any,
- toggleInfo: any,
- togglePreferencesPopup: () => void;
-}) {
- const { t } = useTranslation()
- const gameId = React.useContext(GameIdContext)
- const gameProgress = useAppSelector(selectProgress(gameId))
- const {mobile} = React.useContext(PreferencesContext)
- const [navOpen, setNavOpen] = React.useState(false)
-
- return
-
-
-
-
-
- {!mobile && {t(gameInfo?.title, {ns: gameId})} }
-
-
- {mobile && }
-
-
-
-
-}
-
-/** the navigation bar in a level */
-export function LevelAppBar({isLoading, levelTitle, toggleImpressum, toggleInfo, togglePreferencesPopup, pageNumber=undefined, setPageNumber=undefined} : {
- isLoading: boolean,
- levelTitle: string,
- toggleImpressum: any,
- toggleInfo: any,
- togglePreferencesPopup: any,
- pageNumber?: number,
- setPageNumber?: any,
-}) {
- const { t } = useTranslation()
- const gameId = React.useContext(GameIdContext)
- const {worldId, levelId} = React.useContext(WorldLevelIdContext)
- const {mobile} = React.useContext(PreferencesContext)
- const [navOpen, setNavOpen] = React.useState(false)
- const gameInfo = useGetGameInfoQuery({game: gameId})
- const completed = useAppSelector(selectCompleted(gameId, worldId, levelId))
- const difficulty = useAppSelector(selectDifficulty(gameId))
-
- let worldTitle = gameInfo.data?.worlds.nodes[worldId].title
-
- return
- {mobile ?
- <>
- {/* MOBILE VERSION */}
-
- {levelTitle}
-
-
-
-
-
-
- > :
- <>
- {/* DESKTOP VERSION */}
-
-
- {worldTitle && `${t("World")}: ${t(worldTitle, {ns: gameId})}`}
-
-
- {levelTitle}
-
-
-
- >
- }
-
-}
diff --git a/client/src/components/button.tsx b/client/src/components/button.tsx
deleted file mode 100644
index 57fe728c..00000000
--- a/client/src/components/button.tsx
+++ /dev/null
@@ -1,15 +0,0 @@
-import * as React from 'react';
-import { Link, LinkProps } from "react-router-dom";
-
-export interface ButtonProps extends LinkProps {
- disabled?: boolean
- inverted?: string // Apparently "inverted" in DOM cannot be `boolean` but must be `inverted`
-}
-
-export function Button(props: ButtonProps) {
- if (props.disabled) {
- return {props.children}
- } else {
- return {props.children}
- }
-}
diff --git a/client/src/components/chat.tsx b/client/src/components/chat.tsx
new file mode 100644
index 00000000..8948ced7
--- /dev/null
+++ b/client/src/components/chat.tsx
@@ -0,0 +1,453 @@
+import * as React from 'react'
+import { useContext, useEffect, useRef, useState } from 'react'
+import { useSelector } from 'react-redux'
+import { useTranslation } from 'react-i18next'
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
+import { faArrowRight } from '@fortawesome/free-solid-svg-icons'
+
+import { changedReadIntro, selectCompleted, selectReadIntro } from '../state/progress'
+import { useGetGameInfoQuery, useLoadLevelQuery } from '../state/api'
+import { useAppDispatch, useAppSelector } from '../hooks'
+import { Button, Markdown } from './utils'
+import { ChatContext, GameIdContext, PageContext, PreferencesContext, ProofContext } from '../state/context'
+import { GameHint, InteractiveGoalsWithHints } from './editor/Defs'
+// import { lastStepHasErrors } from './infoview/goals'
+// import { AllMessages } from '../../../node_modules/@leanprover/infoview/dist/infoview/messages'
+// import { LeanDiagnostic, RpcErrorCode, getInteractiveDiagnostics, InteractiveDiagnostic, TaggedText_stripTags } from '@leanprover/infoview-api'
+import { Location, DocumentUri, Diagnostic, DiagnosticSeverity, PublishDiagnosticsParams } from 'vscode-languageserver-protocol'
+// import { InteractiveMessage } from '../../../node_modules/lean4-infoview/src/infoview/traceExplorer'
+
+import '../css/chat.css'
+import { faHome } from '@fortawesome/free-solid-svg-icons'
+
+
+/** Split a string by double newlines and filters out empty segments. */
+function splitIntro (intro : string) {
+ return intro.split(/\n(\s*\n)+/).filter(t => t.trim())
+}
+
+/** Helper to check if a step has any hidden hints. */
+function hasHiddenHints(step: InteractiveGoalsWithHints): boolean {
+ return step?.goals[0]?.hints.some((hint) => hint.hidden)
+}
+
+/** Button which only appears if the current step has hidden hints that are not shown yet. */
+export function MoreHelpButton({selected=null} : {selected?: number}) {
+
+ const { t } = useTranslation()
+
+ const { proof } = React.useContext(ProofContext)
+ const { showHelp, setShowHelp } = React.useContext(ChatContext)
+
+ let k = 0
+ // let k = proof?.steps.length ?
+ // ((selected === null) ? (proof?.steps.length - (lastStepHasErrors(proof) ? 2 : 1)) : selected)
+ // : 0
+
+ const activateHiddenHints = (ev) => {
+ // If the last step (`k`) has errors, we want the hidden hints from the
+ // second-to-last step to be affected
+ if (!(proof?.steps.length)) {return <>>}
+
+ // state must not be mutated, therefore we need to clone the set
+ let tmp = new Set(showHelp)
+ if (tmp.has(k)) {
+ tmp.delete(k)
+ } else {
+ tmp.add(k)
+ }
+ setShowHelp(tmp)
+ console.debug(`help: ${Array.from(tmp.values())}`)
+ }
+
+ if (hasHiddenHints(proof?.steps[k]) && !showHelp.has(k)) {
+ return
+ {t("Show more help!")}
+
+ }
+ return <>>
+}
+
+/** Placeholder that takes the same space as a button. */
+function ButtonPlaceholder() {
+ return
+}
+
+/** The buttons at the bottom of chat. */
+export function ChatButtons ({counter=undefined, setCounter=()=>{}, introMessages=[]} : {
+ counter?: number
+ setCounter?: React.Dispatch>
+ introMessages?: GameHintWithStep[]
+}) {
+ let { t } = useTranslation()
+
+ const { mobile } = useContext(PreferencesContext)
+ const { gameId, worldId, levelId } = useContext(GameIdContext)
+ const {setPage} = useContext(PageContext)
+ const gameInfo = useGetGameInfoQuery({game: gameId})
+ const { proof } = useContext(ProofContext)
+
+ const readIntro = useSelector(selectReadIntro(gameId, worldId))
+
+ return
+ {!levelId && (readIntro || (counter >= introMessages.length) ?
+ ((worldId || mobile) &&
+ <>
+
+ {
+ if (mobile) {
+ console.log('setting `readIntro` to true')
+ setPage(1)
+ }
+ }} >
+ {t("Start")}
+
+ >
+ )
+ :
+ <>
+ {
+ setCounter(counter + 1)
+ }} >
+ {"Read"}
+
+ {
+ setCounter(introMessages.length)
+ }} >
+ {t("Skip all")}
+
+ >
+ )}
+ { (worldId && levelId) ? : <>> }
+ { (worldId && levelId && proof?.completed) ?
+ (levelId == gameInfo.data?.worldSize[worldId] ?
+
+ {t("Home")}
+ :
+
+ {t("Next")}
+
+
+ ) : <>> }
+
+}
+
+/** Insert the variable names in a hint. We do this client-side to prepare
+ * for i18n in the future. i.e. one should be able translate the `rawText`
+ * and have the variables substituted just before displaying.
+ */
+function getHintText(hint: GameHint): string {
+ const {gameId} = React.useContext(GameIdContext)
+ let { t } = useTranslation()
+ if (hint.rawText) {
+ // Replace the variable names used in the hint with the ones used by the player
+ // variable names are marked like `«{g}»` inside the text.
+ return t(hint.rawText, {ns: gameId}).replaceAll(/«\{(.*?)\}»/g, ((_, v) =>
+ // `hint.varNames` contains tuples `[oldName, newName]`
+ (hint.varNames.find(x => x[0] == v))[1]))
+ } else {
+ // hints created in the frontend do not have a `rawText`
+ // TODO: `hint.text` could be removed in theory.
+ return t(hint.text, {ns: gameId})
+ }
+}
+
+/** Hint kinds. Note that number 1-4 are matching the numbers from `DiagnosticSeverity`
+ * from the vscode language server protocol.
+ */
+enum HintKind {
+ Error = 1,
+ Warning = 2,
+ Information = 3,
+ Hint = 4,
+ GameHint = 5,
+ Conclusion = 7,
+}
+
+/** Bundling a hint with the proof-step it comes from. */
+type GameHintWithStep = {
+ hint: GameHint
+ kind: HintKind
+ step?: number
+}
+
+/** Filter hints to not show consequtive identical hints twice.
+ * Hidden hints are not filtered.
+ */
+export function filterHints(hints: GameHint[], prevHints: GameHint[]): GameHint[] {
+ if (!hints) {
+ return []
+ } else if (!prevHints) {
+ return [...hints.filter((hint) => !hint.hidden), ...hints.filter((hint) => hint.hidden)]
+ } else {
+ return [...hints.filter((hint) => !hint.hidden &&
+ (prevHints.find(x => (x.text == hint.text && x.hidden == hint.hidden)) === undefined)
+ ), ...hints.filter((hint) => hint.hidden)]
+ }
+}
+
+// TODO
+// function helper(step, proof, kind, typewriterMode, selectedStep) {
+// return (step == proof?.steps?.length - (lastStepHasErrors(proof) ? 2 : 1) ? ' recent' : '') +
+// (!(kind == HintKind.Conclusion) && step >= (typewriterMode ? proof?.steps?.length : selectedStep+1) ? ' deleted-hint' : '')
+// }
+
+/** A hint as it is displayed in the chat. */
+export function Hint({hint, kind, step=null} : GameHintWithStep) {
+ const { levelId } = useContext(GameIdContext)
+ const { selectedStep, setSelectedStep } = useContext(ChatContext)
+
+ const { proof } = useContext(ProofContext)
+ const { typewriterMode } = useContext(PageContext)
+
+ function toggleSelection () {
+ if (!levelId) {return}
+
+ if (selectedStep !== null && selectedStep == step) {
+ setSelectedStep(null)
+ } else if (step < proof?.steps?.length) {
+ setSelectedStep(step)
+ }
+ }
+
+ // "Deleted hints" are marked in grey. They are used two-fold:
+ // In typewriter, deleting parts of the proof stores the removed hints as `deletedChat`
+ // until the next command is submitted; in editor, moving the cursor through the proof will
+ // render all hints
+ return
+ {getHintText(hint)}
+
+}
+
+/** A collection of hints. If the `counter` is defined, only the first elements will be
+ * shown up to the value of the `counter`.
+ *
+ * Set `conclusion` to true to trigger different style and disable selecting/deleting.
+ */
+export function Hints({ hints, counter=undefined } : {
+ hints: GameHintWithStep[],
+ counter?: number
+}) {
+
+ const { showHelp } = useContext(ChatContext)
+
+ if (!hints) {
+ return <>>
+ }
+
+ // NOTE: This builds on the fact that `.slice(0, undefined)` returns the whole array!
+ // TODO: Should not use index as key.
+ return <>
+ { hints.slice(0, counter).map((hint, j) =>
+ ((!hint.hint.hidden || showHelp.has(hint.step)) &&
+
+ )
+ )}
+ {/* { //showHelp.has(hint.step) &&
+ hints.filter(hint => hint.hint.hidden).map((hint, j) =>
+
+ )} */}
+ >
+}
+
+/** the panel showing the game's introduction text */
+export function ChatPanel ({visible = true}) {
+
+ let { t } = useTranslation()
+
+ const { mobile } = useContext(PreferencesContext)
+ const { gameId, worldId, levelId } = useContext(GameIdContext)
+
+ const completed = useAppSelector(selectCompleted(gameId, worldId, levelId))
+
+ const gameInfo = useGetGameInfoQuery({game: gameId})
+ const levelInfo = useLoadLevelQuery({game: gameId, world: worldId, level: levelId})
+
+ const [counter, setCounter] = useState(1)
+
+ const [introMessages, setIntroMessages] = useState>([])
+ const { chatRef, deletedChat, showHelp, selectedStep } = useContext(ChatContext)
+ const { proof } = useContext(ProofContext)
+
+ const readIntro = useSelector(selectReadIntro(gameId, worldId))
+
+ const dispatch = useAppDispatch()
+
+ useEffect(() => {
+ if(!levelId && counter >= introMessages.length) {
+ dispatch(changedReadIntro({game: gameId, world: worldId, readIntro: true}))
+ }
+ }, [counter, introMessages])
+
+ useEffect(() => {
+ setCounter(1)
+ }, [gameId, worldId, levelId])
+
+ // load and display the correct intro text
+ useEffect(() => {
+ if (levelId > 0) {
+ let introText = t(levelInfo.data?.introduction, {ns : gameId}).trim()
+ let introHint: GameHintWithStep = {hint: {text: introText, hidden: false, rawText: introText }, kind: HintKind.GameHint, step: 0}
+
+ // playable level: show the level's intro
+ if (levelInfo.data?.introduction) {
+ setIntroMessages([introHint])
+ // messages = messages.concat([introHint])
+ }
+ else {
+ setIntroMessages([])
+ }
+ } else {
+ if (worldId) {
+ let introText = t(gameInfo.data?.worlds.nodes[worldId].introduction, {ns: gameId}).trim()
+ let introHints: GameHintWithStep[] = splitIntro(introText).map( txt => ({hint: {text: txt, hidden: false, rawText: txt }, kind: HintKind.GameHint, step: 0}))
+
+ // Level 0: show the world's intro
+ if (gameInfo.data?.worlds.nodes[worldId].introduction) {
+ // messages = messages.concat(introHints)
+ setIntroMessages(introHints)
+ } else {
+ setIntroMessages([])
+ }
+ } else {
+ let introText = t(gameInfo.data?.introduction, {ns : gameId}).trim()
+ let introHints: GameHintWithStep[] = splitIntro(introText).map( txt => ({hint: {text: txt, hidden: false, rawText: txt }, kind: HintKind.GameHint, step: 0}))
+
+ // world overview: show the game's intro
+ if (gameInfo.data?.introduction) {
+ // messages = messages.concat(introHints)
+ setIntroMessages(introHints)
+ } else {
+ setIntroMessages([])
+ }
+ }
+ }
+ }, [gameInfo, levelInfo, gameId, worldId, levelId, proof])
+
+ // Scroll the chat
+ useEffect(() => {
+ if (levelId > 0) {
+
+ if (proof) {
+ if (proof?.completed) {
+ // proof currently completed: scroll down
+ console.debug('scroll chat: down to conclusion')
+ chatRef.current!.lastElementChild?.scrollIntoView({block: "center"})
+ } else {
+ // proof currently not completed: first message of last step
+ let lastStep = proof?.steps.length //- (lastStepHasErrors(proof) ? 2 : 1)
+ console.debug(`scroll chat: first message of step ${lastStep}`)
+ chatRef.current?.getElementsByClassName(`step-${lastStep}`)[0]?.scrollIntoView({block: "center"})
+ }
+ } else {
+ // no proof available: scroll to top.
+ console.debug(`scroll chat: top`)
+ chatRef.current!.scrollTo(0,0)
+ }
+ } else {
+ // introduction: scroll to last message
+ console.debug('scroll chat: down')
+ chatRef.current!.lastElementChild?.scrollIntoView({block: "center"})
+ }
+ }, [counter, introMessages, gameId, worldId, levelId])
+
+ // Scroll down when new hidden hints are triggered
+ useEffect(() => {
+ if (levelId > 0) {
+ let lastStep = proof?.steps.length //- (lastStepHasErrors(proof) ? 2 : 1)
+ if (showHelp.has(lastStep)) {
+ console.debug('scroll chat: down to hidden hints')
+ // TODO: last element of hidden hints?
+ chatRef.current!.lastElementChild?.scrollIntoView({block: "center"})
+ }
+ }
+ }, [showHelp, gameId, worldId, levelId])
+
+ // Scroll to corresponding messages if selected step changes
+ useEffect(() => {
+ if (levelId > 0 && selectedStep !== null) {
+ console.debug(`scroll chat: first message of selected step ${selectedStep}`)
+ chatRef.current?.getElementsByClassName(`step-${selectedStep}`)[0]?.scrollIntoView({block: "center"})
+ // Array.from(chatRef.current?.getElementsByClassName(`step-${selectedStep}`)).map((elem) => {
+ // elem.scrollIntoView({block: "center"})
+ // })
+ }
+ }, [selectedStep, gameId, worldId, levelId])
+
+ /** TODO: What's the magic here? Only needed if diags are displayed in chat. */
+ function diagToString (diag) {
+ // Hide "unsolved goals" messages
+ let message;
+ if ("append" in diag.message && "text" in diag.message.append[0] &&
+ diag.message?.append[0].text === "unsolved goals") {
+ message = diag.message.append[0]
+ } else {
+ message = diag.message
+ }
+ return message
+ }
+
+ return
+
+ { gameInfo.error &&
+
+ Could not find the game!
+
+ }
+
+ {proof?.steps.map((step, i) => {
+ let x = [].concat(
+ filterHints(step.goals[0]?.hints, proof.steps[i-1]?.goals[0]?.hints).map(hint => ({hint: hint, kind: HintKind.GameHint, step: i})),
+ // // TODO: Uncomment this if you want to see the diags in chat
+ // step.diags.map(diag => ({hint: diagToString(diag), kind: diag.severity, step: i}))
+ )
+
+ return
+ })}
+
+ {/* */}
+ {/* {proof?.steps.map((step, i) =>
+ ({hint: hint, step: i}))}/>
+ )} */}
+ {/* ({hint: hint, step: proof?.steps?.length - 1}))} /> */}
+
+ { deletedChat &&
+ ({hint: hint, kind: HintKind.GameHint, step: proof?.steps?.length}))} />
+ }
+ { completed && levelInfo.data?.conclusion &&
+
+ }
+
+ {/* {chatMessages.map(((t, i) =>
+ t.trim() ?
+
+ : <>>
+ ))} */}
+
+ {
}
+
+}
diff --git a/client/src/components/infoview/rpc_api.ts b/client/src/components/editor/Defs.ts
similarity index 54%
rename from client/src/components/infoview/rpc_api.ts
rename to client/src/components/editor/Defs.ts
index 3a6acbaa..25eb98e1 100644
--- a/client/src/components/infoview/rpc_api.ts
+++ b/client/src/components/editor/Defs.ts
@@ -1,67 +1,72 @@
/**
* @fileOverview Defines the interface for the communication with the server.
*
- * This file is based on `vscode-lean4/vscode-lean4/src/rpcApi.ts`
*/
-import type { Range } from 'vscode-languageserver-protocol';
-import type { ContextInfo, FVarId, CodeWithInfos, MVarId } from '@leanprover/infoview-api';
-import { InteractiveDiagnostic, TermInfo } from '@leanprover/infoview/*';
-import type { Diagnostic } from 'vscode-languageserver-protocol';
+import type { Range } from 'vscode-languageserver-protocol'
+import type {
+ CodeWithInfos,
+ ContextInfo,
+ FVarId,
+ InteractiveDiagnostic,
+ MVarId,
+ TermInfo
+} from '@leanprover/infoview-api'
+import type { Diagnostic } from 'vscode-languageserver-protocol'
export interface InteractiveHypothesisBundle {
/** The pretty names of the variables in the bundle. Anonymous names are rendered
* as `"[anonymous]"` whereas inaccessible ones have a `✝` appended at the end.
* Use `InteractiveHypothesisBundle_nonAnonymousNames` to filter anonymouse ones out. */
- names: string[];
- fvarIds?: FVarId[];
- type: CodeWithInfos;
- val?: CodeWithInfos;
- isInstance?: boolean;
- isType?: boolean;
- isInserted?: boolean;
- isRemoved?: boolean;
- isAssumption?: boolean;
+ names: string[]
+ fvarIds?: FVarId[]
+ type: CodeWithInfos
+ val?: CodeWithInfos
+ isInstance?: boolean
+ isType?: boolean
+ isInserted?: boolean
+ isRemoved?: boolean
+ isAssumption?: boolean
}
export interface InteractiveGoalCore {
- hyps: InteractiveHypothesisBundle[];
- type: CodeWithInfos;
- ctx?: ContextInfo;
+ hyps: InteractiveHypothesisBundle[]
+ type: CodeWithInfos
+ ctx?: ContextInfo
}
export interface InteractiveGoal extends InteractiveGoalCore {
- userName?: string;
- goalPrefix?: string;
- mvarId?: MVarId;
- isInserted?: boolean;
- isRemoved?: boolean;
+ userName?: string
+ goalPrefix?: string
+ mvarId?: MVarId
+ isInserted?: boolean
+ isRemoved?: boolean
}
export interface InteractiveGoals extends InteractiveGoalCore {
- goals: InteractiveGoals[];
+ goals: InteractiveGoals[]
}
export interface InteractiveTermGoal extends InteractiveGoalCore {
- range?: Range;
- term?: TermInfo;
+ range?: Range
+ term?: TermInfo
}
export interface GameHint {
- text: string;
- hidden: boolean;
- rawText: string;
- varNames: string[][]; // in Lean: `Array (Name × Name)`
+ text: string
+ hidden: boolean
+ rawText: string
+ varNames?: string[][] // in Lean: `Array (Name × Name)`
}
export interface InteractiveGoalWithHints {
- goal: InteractiveGoal;
- hints: GameHint[];
+ goal: InteractiveGoal
+ hints: GameHint[]
}
export interface InteractiveGoalsWithHints {
- goals: InteractiveGoalWithHints[];
- command: string;
- diags: InteractiveDiagnostic[];
+ goals: InteractiveGoalWithHints[]
+ command: string
+ diags: InteractiveDiagnostic[]
}
/**
@@ -74,11 +79,11 @@ export interface ProofState {
*
* In particular `step[i]` is the proof step at the beginning of line `i` in vscode.
*/
- steps: InteractiveGoalsWithHints[];
+ steps: InteractiveGoalsWithHints[]
/** The remaining diagnostics that are not in the steps. Usually this should only
* be the "unsolved goals" message, I believe.
*/
- diagnostics : InteractiveDiagnostic[];
- completed : Boolean;
- completedWithWarnings : Boolean;
+ diagnostics : InteractiveDiagnostic[]
+ completed : Boolean
+ completedWithWarnings : Boolean
}
diff --git a/client/src/components/editor/Editor.tsx b/client/src/components/editor/Editor.tsx
new file mode 100644
index 00000000..8a4de007
--- /dev/null
+++ b/client/src/components/editor/Editor.tsx
@@ -0,0 +1,181 @@
+import * as React from 'react';
+import Split from 'react-split'
+import { useContext, useEffect, useRef, useState } from 'react'
+import { useTranslation } from "react-i18next"
+import { GameIdContext, MonacoEditorContext } from '../../state/context';
+import { useLoadLevelQuery } from '../../state/api';
+import { Markdown } from '../utils';
+import * as monaco from 'monaco-editor'
+import { LeanMonaco, LeanMonacoEditor, LeanMonacoOptions } from 'lean4monaco'
+import {RpcConnected, RpcConnectParams} from '@leanprover/infoview-api'
+import '../../css/editor.css'
+import { useSelector } from 'react-redux';
+import { selectTypewriterMode } from '../../state/progress';
+import { Typewriter } from './Typewriter';
+import { GoalTabs } from './goal_tabs';
+import { GameInfoview } from './tmp';
+import { LeanClient } from 'lean4monaco/dist/vscode-lean4/vscode-lean4/src/leanclient'
+// import { parseExtUri } from 'lean4monaco/dist/vscode-lean4/vscode-lean4/src/utils/exturi';
+
+// import { LeanMonacoContext } from './LeanMonaco'
+import { RpcSessionAtPos } from 'lean4monaco/dist/vscode-lean4/vscode-lean4/src/infoview'
+import { Uri } from 'monaco-editor';
+
+export function Editor() {
+ let { t } = useTranslation()
+ const {gameId, worldId, levelId } = useContext(GameIdContext)
+
+ const typewriterMode = useSelector(selectTypewriterMode(gameId))
+
+ const editorRef = useRef(null)
+ const infoviewRef = useRef(null)
+ const gameInfoviewRef = useRef(null)
+ const [leanMonacoEditor, setLeanMonacoEditor] = useState(undefined)
+ const [leanMonaco, setLeanMonaco] = useState()
+ const [code, setCode] = useState('')
+
+ const [client, setClient] = useState(null)
+ const [uri, setUri] = useState(null)
+ const [rpcSess, setRpcSess] = useState(null)
+
+ const [options, setOptions] = useState({
+ // placeholder. gets set below
+ websocket: {
+ url: ''
+ }
+ })
+
+ // Update LeanMonaco options when preferences are loaded or change
+ useEffect(() => {
+ var socketUrl = ((window.location.protocol === "https:") ? "wss://" : "ws://") +
+ window.location.host + `/websocket/${gameId}`
+ console.log(`[LeanGame] socket url: ${socketUrl}`)
+ var _options: LeanMonacoOptions = {
+ websocket: {
+ url: socketUrl,
+ // @ts-ignore
+ difficulty: 1,
+ inventory: []
+ },
+ // Restrict monaco's extend (e.g. context menu) to the editor itself
+ htmlElement: editorRef.current ?? undefined,
+ vscode: {
+ /* To add settings here, you can open your settings in VSCode (Ctrl+,), search
+ * for the desired setting, select "Copy Setting as JSON" from the "More Actions"
+ * menu next to the selected setting, and paste the copied string here.
+ */
+ // "workbench.colorTheme": preferences.theme,
+ "editor.tabSize": 2,
+ // "editor.rulers": [100],
+ "editor.lightbulb.enabled": "on",
+ "editor.wordWrap": "on",
+ "editor.wrappingStrategy": "advanced",
+ "editor.semanticHighlighting.enabled": true,
+ "editor.acceptSuggestionOnEnter": "off",
+ "lean4.input.eagerReplacementEnabled": true,
+ // "lean4.input.leader": preferences.abbreviationCharacter
+ }
+ }
+ setOptions(_options)
+ }, [editorRef])
+
+ // Setting up the editor and infoview
+ useEffect(() => {
+ console.debug('[LeanGame] Restarting Editor!')
+ var _leanMonaco = new LeanMonaco()
+
+ var leanMonacoEditor = new LeanMonacoEditor()
+
+ _leanMonaco.setInfoviewElement(infoviewRef.current!)
+ ;(async () => {
+ await _leanMonaco.start(options)
+
+ // JE: how do I get the editorApi or an RPC session?
+ // let infoProvider = _leanMonaco.infoProvider.editorApi
+
+ console.warn('gameId', gameId)
+ await leanMonacoEditor.start(editorRef.current!, `/${worldId}/L_${levelId}.lean`, code)
+
+ setLeanMonacoEditor(leanMonacoEditor)
+ setLeanMonaco(_leanMonaco)
+
+ // Keeping the `code` state up-to-date with the changes in the editor
+ leanMonacoEditor.editor?.onDidChangeModelContent(() => {
+ setCode(leanMonacoEditor.editor?.getModel()?.getValue()!)
+ })
+ })()
+ return () => {
+ leanMonacoEditor.dispose()
+ _leanMonaco.dispose()
+ }
+ }, [options, infoviewRef, editorRef, gameId, worldId, levelId])
+
+// RPC session: start new rpc session using `uri` and `client`
+useEffect(() => {
+ console.log('connecting to RPC')
+
+ if (!(leanMonacoEditor?.editor) || !(leanMonaco?.clientProvider)) { return }
+
+ const updateUri = () => {
+ const model = leanMonacoEditor.editor.getModel()
+ if (model?.uri) {
+ setUri(model.uri)
+ return true
+ }
+ return false
+ }
+ const updateClient = () => {
+ const clients = leanMonaco.clientProvider.getClients()
+ if (clients?.[0]?.running) {
+ setClient(clients[0])
+ return true
+ }
+ return false
+ }
+ const tryUpdate = () => {
+ const uriUpdated = updateUri()
+ const clientUpdated = updateClient()
+ if (uriUpdated && clientUpdated) {
+ console.log('updated client and uri')
+ clearInterval(interval)
+ }
+ }
+ tryUpdate()
+ const interval = setInterval(tryUpdate, 500)
+ return () => clearInterval(interval)
+}, [leanMonaco?.clientProvider, leanMonacoEditor?.editor])
+
+// RPC session: wait until the `uri` is defined
+useEffect(() => {
+ if (!client || !uri) { return }
+ console.log('connecting to RPC')
+ console.log(`client: ${client}`)
+ console.log(client)
+ console.log(`uri: ${uri}`)
+
+ client.sendRequest('$/lean/rpc/connect', {uri: uri.toString()} as RpcConnectParams).then(result => {
+ const sessionId = result.sessionId
+ console.debug(`session id: ${sessionId}`)
+ let _rpcSess = new RpcSessionAtPos(client, sessionId, uri.toString())
+ setRpcSess(_rpcSess)
+ }).catch(
+ reason => {console.error(`failed: ${reason}`)}
+ )
+
+ return () => {
+ rpcSess?.dispose()
+ }
+}, [client, uri])
+
+ return
+
+
+
+ {/* TODO: */}
+ {/* */}
+
+ {leanMonacoEditor && typewriterMode &&
}
+
+
+}
diff --git a/client/src/components/editor/ExcerciseStatement.tsx b/client/src/components/editor/ExcerciseStatement.tsx
new file mode 100644
index 00000000..987f3b69
--- /dev/null
+++ b/client/src/components/editor/ExcerciseStatement.tsx
@@ -0,0 +1,37 @@
+import * as React from 'react';
+import { useContext, useEffect, useRef, useState } from 'react'
+import { useTranslation } from "react-i18next"
+import { GameIdContext } from '../../state/context';
+import { useLoadLevelQuery } from '../../state/api';
+import { Markdown } from '../utils';
+
+/** The mathematical formulation of the statement, supporting e.g. Latex
+ * It takes three forms, depending on the precence of name and description:
+ * - Theorem xyz: description
+ * - Theorem xyz
+ * - Exercises: description
+ *
+ * If `showLeanStatement` is true, it will additionally display the lean code.
+ */
+export function ExerciseStatement({ showLeanStatement = false }) {
+ let { t } = useTranslation()
+ const {gameId, worldId, levelId } = useContext(GameIdContext)
+ const levelInfo = useLoadLevelQuery({game: gameId, world: worldId, level: levelId})
+
+ if (!(levelInfo.data?.descrText || levelInfo.data?.descrFormat)) { return <>> }
+ return <>
+
+ {levelInfo.data?.descrText ?
+
+ {(levelInfo.data?.displayName ? `**${t("Theorem")}** \`${levelInfo.data?.displayName}\`: ` : '') + t(levelInfo.data?.descrText, {ns: gameId})}
+ : levelInfo.data?.displayName &&
+
+ {`**${t("Theorem")}** \`${levelInfo.data?.displayName}\``}
+
+ }
+ {levelInfo.data?.descrFormat && showLeanStatement &&
+
{levelInfo.data?.descrFormat}
+ }
+
+ >
+}
diff --git a/client/src/components/editor/Typewriter.tsx b/client/src/components/editor/Typewriter.tsx
new file mode 100644
index 00000000..2223dcba
--- /dev/null
+++ b/client/src/components/editor/Typewriter.tsx
@@ -0,0 +1,261 @@
+import * as React from 'react'
+import { useContext, useRef, useState, useEffect } from 'react'
+import { useTranslation } from 'react-i18next'
+import { GameIdContext, InputModeContext, MonacoEditorContext, ProofContext } from '../../state/context'
+import { useGetGameInfoQuery } from '../../state/api'
+
+import { faWandMagicSparkles } from '@fortawesome/free-solid-svg-icons'
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
+import '../../css/typewriter.css'
+import * as monaco from 'monaco-editor'
+import { RpcConnectParams, useRpcSession } from '@leanprover/infoview'
+import { LeanClient } from 'lean4monaco/dist/vscode-lean4/vscode-lean4/src/leanclient'
+import { RpcSessionAtPos } from 'lean4monaco/dist/vscode-lean4/vscode-lean4/src/infoview'
+
+/** The input field */
+function TypewriterInput({disabled}: {disabled?: boolean}) {
+ let { t } = useTranslation()
+ const [typewriterInput, setTypewriterInput] = useState("") // React.useContext(InputModeContext)
+ const {proof, setProof, interimDiags, setInterimDiags, setCrashed} = React.useContext(ProofContext)
+
+ const inputRef = useRef()
+ const [processing, setProcessing] = useState(false)
+ const [oneLineEditor, setOneLineEditor] = useState(null)
+
+ /** Reference to the hidden multi-line editor */
+ const {leanMonacoEditor, leanMonaco, rpcSess} = React.useContext(MonacoEditorContext)
+
+ /** Monaco editor requires the code to be set manually. */
+ function setTypewriterContent (typewriterInput: string) {
+ oneLineEditor?.getModel()?.setValue(typewriterInput)
+ setTypewriterInput(typewriterInput)
+ }
+
+ // Run the command
+ const runCommand = React.useCallback(() => {
+ if (processing) {return}
+ console.log('processing typewriter input')
+
+ rpcSess.client.sendRequest('$/lean/rpc/call',
+ { method: "Lean.Widget.getInteractiveTermGoal",
+ params: {
+ textDocument: {
+ uri: rpcSess.uri.toString(),
+ // position: {line: 0, character: 1}
+ },
+ position: {line: 0, character: 1},
+ sessionId: rpcSess.sessionId
+ }
+ }
+ ).then(result => {
+ console.log("Got an answer to the Rpc request!")
+ console.debug(result)
+ }).catch(reason => {
+ console.error(`Rpc request failed!`)
+ console.debug(reason)
+ })
+
+ rpcSess.client.sendRequest('$/lean/rpc/call',
+ { method: "lean4game.test",
+ textDocument: {uri: rpcSess.uri},
+ position: {line: 0, character: 0},
+ sessionId: rpcSess.sessionId
+ }
+ ).then(
+ result =>
+ console.log(`Got a RPC answer: ${result}`)
+ ).catch(
+ reason =>
+ console.log(`RPC failed: ${reason}`)
+ )
+
+
+
+ // let uri = leanMonacoEditor?.editor?.getModel()?.uri.toString()
+ // let client = leanMonaco?.clientProvider?.getClients()[0]
+
+
+ // client.sendRequest('$/lean/rpc/connect', {uri: uri.toString()} as RpcConnectParams).then(result => {
+ // const sessionId = result.sessionId
+ // console.debug(`session id: ${sessionId}`)
+ // let rpcSess = new RpcSessionAtPos(client, sessionId, uri.toString())
+
+
+
+ // rpcSess.client.sendRequest('$/lean/rpc/call',
+ // { method: "Lean.Widget.getInteractiveTermGoal",
+ // params: {
+ // textDocument: {
+ // uri: rpcSess.uri.toString(),
+ // // position: {line: 0, character: 1}
+ // },
+ // position: {line: 0, character: 1},
+ // sessionId: rpcSess.sessionId
+ // }
+ // }
+ // ).then(result => {
+ // console.log("Got an answer to the Rpc request!")
+ // console.debug(result)
+ // }).catch(reason => {
+ // console.error(`Rpc request failed!`)
+ // console.debug(reason)
+ // })
+
+ // rpcSess.client.sendRequest('$/lean/rpc/call',
+ // { method: "lean4game.test",
+ // textDocument: {uri: rpcSess.uri},
+ // position: {line: 0, character: 0},
+ // sessionId: rpcSess.sessionId
+ // }
+ // ).then(
+ // result =>
+ // console.log(`Got a RPC answer: ${result}`)
+ // ).catch(
+ // reason =>
+ // console.log(`RPC failed: ${reason}`)
+ // )
+
+ // }).catch(
+ // reason => {console.error(`failed: ${reason}`)}
+ // )
+
+ // // TODO: Desired logic is to only reset this after a new *error-free* command has been entered
+ // setDeletedChat([])
+
+ // const pos = editor.getPosition()
+ const pos = leanMonacoEditor.editor.getModel().getFullModelRange().getEndPosition()
+
+ // rpcSess.call('Game.test', pos).then((response) => {
+ // console.debug('test Rpc call worked')
+ // console.debug(response)
+ // }).catch((err) => {
+ // console.error("failed")
+ // console.error(err)
+ // })
+
+ if (typewriterInput) {
+ // setProcessing(true)
+ leanMonacoEditor.editor.executeEdits("typewriter", [{
+ range: monaco.Selection.fromPositions(
+ pos,
+ leanMonacoEditor.editor.getModel().getFullModelRange().getEndPosition()
+ ),
+ text: typewriterInput.trim() + "\n",
+ forceMoveMarkers: false
+ }])
+ setTypewriterContent('')
+ // // Load proof after executing edits
+ // loadGoals(rpcSess, uri, setProof, setCrashed)
+ }
+
+ leanMonacoEditor.editor.setPosition(pos)
+ }, [leanMonacoEditor.editor, typewriterInput, leanMonaco, rpcSess])
+
+ /*
+ Keep `typewriterInput` up-to-date with editor content and
+ ensure that our one-line editor can only have a single line
+ */
+ useEffect(() => {
+ if (!oneLineEditor) {return}
+ const l = oneLineEditor.onDidChangeModelContent(() => {
+ const value = oneLineEditor.getValue()
+ const valueClean = value.replace(/[\n\r]/g, '')
+ setTypewriterInput(valueClean)
+ if (value != valueClean) {
+ oneLineEditor.setValue(valueClean)
+ }
+ })
+ return () => {l.dispose()}
+ }, [oneLineEditor])
+
+ /* Set up `oneLineEditor` */
+ useEffect(() => {
+ const _editor = monaco.editor.create(inputRef.current!, {
+ value: typewriterInput,
+ language: "lean4cmd",
+ quickSuggestions: false,
+ lightbulb: {
+ enabled: monaco.editor.ShowLightbulbIconMode.On
+ },
+ unicodeHighlight: {
+ ambiguousCharacters: false,
+ },
+ automaticLayout: true,
+ minimap: {
+ enabled: false
+ },
+ lineNumbers: 'off',
+ tabSize: 2,
+ glyphMargin: false,
+ folding: false,
+ lineDecorationsWidth: 0,
+ lineNumbersMinChars: 0,
+ 'semanticHighlighting.enabled': true,
+ overviewRulerLanes: 0,
+ hideCursorInOverviewRuler: true,
+ scrollbar: {
+ vertical: 'hidden',
+ horizontalScrollbarSize: 3
+ },
+ overviewRulerBorder: false,
+ theme: 'vs-code-theme-converted',
+ contextmenu: false
+ })
+
+ setOneLineEditor(_editor)
+
+ // const config: AbbreviationConfig = {
+ // abbreviationCharacter: '\\',
+ // customTranslations: undefined,
+ // eagerReplacementEnabled: true
+ // }
+ // const provider = new AbbreviationProvider(config)
+ // const abbrevRewriter = new AbbreviationRewriter(config, provider, editor.getModel())
+
+ return () => {/*abbrevRewriter.dispose();*/ _editor.dispose()}
+ }, [])
+
+ /* Run command when pressing enter */
+ useEffect(() => {
+ if (!oneLineEditor) return
+ const l = oneLineEditor.onKeyUp((ev) => {
+ if (ev.code === "Enter") {
+ runCommand()
+ }
+ })
+ return () => { l.dispose() }
+ }, [oneLineEditor, runCommand])
+
+ /* Run command when pressing the button */
+ const handleSubmit : React.FormEventHandler = (ev) => {
+ ev.preventDefault()
+ runCommand()
+ }
+
+
+ return
+}
+
+
+export function Typewriter() {
+ let { t } = useTranslation()
+ const {gameId, worldId, levelId} = useContext(GameIdContext)
+ const editor = useContext(MonacoEditorContext)
+
+ // const model = editor.getModel()
+ // const uri = model.uri.toString()
+ // const gameInfo = useGetGameInfoQuery({game: gameId})
+
+ return
+
+
+}
diff --git a/client/src/components/editor/goal.tsx b/client/src/components/editor/goal.tsx
new file mode 100644
index 00000000..585b10c3
--- /dev/null
+++ b/client/src/components/editor/goal.tsx
@@ -0,0 +1,154 @@
+import * as React from 'react';
+import { InteractiveGoal, InteractiveHypothesisBundle } from './Defs';
+import { useTranslation } from 'react-i18next';
+import { InteractiveCode, InteractiveHypothesisBundle_nonAnonymousNames, LocationsContext, SubexprInfo, TaggedText } from '@leanprover/infoview';
+// import { SelectableLocation } from '../../../../../node_modules/lean4-infoview/src/infoview/goalLocation';
+
+/** Returns true if `h` is inaccessible according to Lean's default name rendering. */
+function isInaccessibleName(h: string): boolean {
+ return h.indexOf('✝') >= 0;
+}
+
+interface GoalFilterState {
+ /** If true reverse the list of hypotheses, if false present the order received from LSP. */
+ reverse: boolean,
+ /** If true show hypotheses that have isType=True, otherwise hide them. */
+ showType: boolean,
+ /** If true show hypotheses that have isInstance=True, otherwise hide them. */
+ showInstance: boolean,
+ /** If true show hypotheses that contain a dagger in the name, otherwise hide them. */
+ showHiddenAssumption: boolean
+ /** If true show the bodies of let-values, otherwise hide them. */
+ showLetValue: boolean;
+}
+
+interface HypProps {
+ hyp: InteractiveHypothesisBundle
+ mvarId?: any // MVarId
+}
+
+// function Hyp({ hyp: h, mvarId }: HypProps) {
+// const locs = React.useContext(LocationsContext)
+
+// const namecls: string = 'mr1 ' +
+// (h.isInserted ? 'inserted-text ' : '') +
+// (h.isRemoved ? 'removed-text ' : '')
+
+// const names = InteractiveHypothesisBundle_nonAnonymousNames(h as InteractiveHypothesisBundle).map((n, i) =>
+//
+// i ?
+// { mvarId, loc: { hyp: h.fvarIds[i] }} :
+// undefined
+// }
+// alwaysHighlight={false}
+// >{n}
+// )
+
+// const typeLocs: Locations | undefined = React.useMemo(() =>
+// locs && mvarId && h.fvarIds && h.fvarIds.length > 0 ?
+// { ...locs, subexprTemplate: { mvarId, loc: { hypType: [h.fvarIds[0], ''] }}} :
+// undefined,
+// [locs, mvarId, h.fvarIds])
+
+// const valLocs: Locations | undefined = React.useMemo(() =>
+// h.val && locs && mvarId && h.fvarIds && h.fvarIds.length > 0 ?
+// { ...locs, subexprTemplate: { mvarId, loc: { hypValue: [h.fvarIds[0], ''] }}} :
+// undefined,
+// [h.val, locs, mvarId, h.fvarIds])
+
+// return
+// {names}
+// :
+//
+//
+//
+// {h.val &&
+//
+// :=
+// }
+//
+// }
+
+function getFilteredHypotheses(hyps: InteractiveHypothesisBundle[], filter: GoalFilterState): InteractiveHypothesisBundle[] {
+ return hyps.reduce((acc: InteractiveHypothesisBundle[], h) => {
+ if (h.isInstance && !filter.showInstance) return acc
+ if (h.isType && !filter.showType) return acc
+ const names = filter.showHiddenAssumption ? h.names : h.names.filter(n => !isInaccessibleName(n))
+ const hNew: InteractiveHypothesisBundle = filter.showLetValue ? { ...h, names } : { ...h, names, val: undefined }
+ if (names.length !== 0) acc.push(hNew)
+ return acc
+ }, [])
+}
+
+interface GoalProps {
+ goal: InteractiveGoal
+ filter: GoalFilterState
+ showHints?: boolean
+ typewriter: boolean
+ unbundle?: boolean /** unbundle `x y : Nat` into `x : Nat` and `y : Nat` */
+}
+
+/**
+ * Displays the hypotheses, target type and optional case label of a goal according to the
+ * provided `filter`. */
+export const Goal = React.memo((props: GoalProps) => {
+ const { goal, filter, showHints, typewriter, unbundle } = props
+ let { t } = useTranslation()
+
+ // TODO: Apparently `goal` can be `undefined`
+ if (!goal) {return <>>}
+
+ const filteredList = getFilteredHypotheses(goal.hyps, filter);
+ const hyps = filter.reverse ? filteredList.slice().reverse() : filteredList;
+ const locs = React.useContext(LocationsContext)
+ const goalLocs = React.useMemo(() =>
+ locs && goal.mvarId ?
+ { ...locs, subexprTemplate: { mvarId: goal.mvarId, loc: { target: '' }}} :
+ undefined,
+ [locs, goal.mvarId])
+ const goalLi =
+ {/*
{t("Goal")}:
*/}
+
+ } />
+
+
+
+ // let cn = 'font-code tl pre-wrap bl bw1 pl1 b--transparent '
+ // if (props.goal.isInserted) cn += 'b--inserted '
+ // if (props.goal.isRemoved) cn += 'b--removed '
+
+ function unbundleHyps (hyps: InteractiveHypothesisBundle[]) : InteractiveHypothesisBundle[] {
+ return hyps.flatMap(hyp => (
+ unbundle ? hyp.names.map(name => {return {...hyp, names: [name]}}) : [hyp]
+ ))
+ }
+
+ // const hints =
+ const objectHyps = unbundleHyps(hyps.filter(hyp => !hyp.isAssumption))
+ const assumptionHyps = unbundleHyps(hyps.filter(hyp => hyp.isAssumption))
+
+ return <>
+ {/* {goal.userName && case {goal.userName}
} */}
+ {filter.reverse && goalLi}
+
+ {! typewriter && objectHyps.length > 0 &&
+
{t("Objects")}:
+ {objectHyps.map((h, i) =>
)}
}
+ {!typewriter && assumptionHyps.length > 0 &&
+
{t("Assumptions")}:
+ {assumptionHyps.map((h, i) =>
)}
}
+
+ {!filter.reverse && <>
+
+
+
+
+
+
+ {goalLi}
+ >}
+ {/* {showHints && hints} */}
+ >
+})
diff --git a/client/src/components/editor/goal_tabs.tsx b/client/src/components/editor/goal_tabs.tsx
new file mode 100644
index 00000000..4aa5aab4
--- /dev/null
+++ b/client/src/components/editor/goal_tabs.tsx
@@ -0,0 +1,36 @@
+import * as React from 'react';
+import { useTranslation } from "react-i18next";
+import { InteractiveGoalWithHints } from "../Defs";
+import { Goal } from './goal';
+
+const goalFilter = {
+ reverse: false,
+ showType: true,
+ showInstance: true,
+ showHiddenAssumption: true,
+ showLetValue: true
+}
+
+/** The tabs of goals that lean has after the command of this step has been processed */
+export function GoalTabs({ goals, last, onClick, onGoalChange=(n)=>{}}: { goals: InteractiveGoalWithHints[], last : boolean, onClick? : any, onGoalChange?: (n?: number) => void }) {
+ let { t } = useTranslation()
+ const [selectedGoal, setSelectedGoal] = React.useState(0)
+
+ if (goals.length == 0) {
+ return <>>
+ }
+
+ return
+
+ {goals.map((goal, i) => (
+ // TODO: Should not use index as key.
+
{ onGoalChange(i); setSelectedGoal(i); ev.stopPropagation() }}>
+ {i ? t("Goal") + ` ${i + 1}` : t("Active Goal")}
+
+ ))}
+
+
+
+
+
+}
diff --git a/client/src/components/editor/infoview.tsx b/client/src/components/editor/infoview.tsx
new file mode 100644
index 00000000..42305e3d
--- /dev/null
+++ b/client/src/components/editor/infoview.tsx
@@ -0,0 +1,47 @@
+import { InteractiveDiagnostics_msgToInteractive, MessageData } from '@leanprover/infoview-api'
+import { useRpcSession } from './infoview/rpcSessions'
+import { InteractiveMessage } from './infoview/traceExplorer'
+import { mapRpcError, useAsync } from './infoview/util'
+
+export * from '@leanprover/infoview-api'
+export { EditorContext, EnvPosContext, VersionContext } from './infoview/contexts'
+export { EditorConnection } from './infoview/editorConnection'
+export { GoalLocation, GoalsLocation, LocationsContext } from './infoview/goalLocation'
+export { InteractiveCode, /*InteractiveCodeProps*/ } from './infoview/interactiveCode'
+export { renderInfoview } from './infoview/main'
+export { RpcContext, useRpcSession } from './infoview/rpcSessions'
+export { ServerVersion } from './infoview/serverVersion'
+export { DynamicComponent, /*DynamicComponentProps, PanelWidgetProps,*/ importWidgetModule } from './infoview/userWidget'
+export {
+ DocumentPosition,
+ mapRpcError,
+ useAsync,
+ useAsyncPersistent,
+ useAsyncWithTrigger,
+ useClientNotificationEffect,
+ useClientNotificationState,
+ useEvent,
+ useEventResult,
+ useServerNotificationEffect,
+ useServerNotificationState,
+} from './infoview/util'
+// export { MessageData }
+
+/** Display the given message data as interactive, pretty-printed text. */
+export function InteractiveMessageData({ msg }: { msg: MessageData }) {
+ const rs = useRpcSession()
+ const interactive = useAsync(() => InteractiveDiagnostics_msgToInteractive(rs, msg, 0), [rs, msg])
+
+ if (interactive.state === 'resolved') {
+ return
+ } else if (interactive.state === 'loading') {
+ return <>...>
+ } else {
+ return (
+
+ Failed to display message:
+ {{mapRpcError(interactive.error).message} }
+
+ )
+ }
+}
diff --git a/client/src/components/editor/old.typewriter.tsx b/client/src/components/editor/old.typewriter.tsx
new file mode 100644
index 00000000..4f82a453
--- /dev/null
+++ b/client/src/components/editor/old.typewriter.tsx
@@ -0,0 +1,445 @@
+import * as React from 'react'
+import { useContext } from 'react'
+import { useRef, useState, useEffect } from 'react'
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
+import { faArrowRight, faHome, faWandMagicSparkles } from '@fortawesome/free-solid-svg-icons'
+import { DiagnosticSeverity, PublishDiagnosticsParams, DocumentUri } from 'vscode-languageserver-protocol';
+import { useTranslation } from 'react-i18next'
+import * as monaco from 'monaco-editor'
+import { ChatContext, GameIdContext, InputModeContext, MonacoEditorContext, PageContext, PreferencesContext, ProofContext } from '../../state/context';
+
+import { RpcContext, WithRpcSessions, useRpcSessionAtPos } from '../../../../node_modules/lean4-infoview/src/infoview/rpcSessions';
+import { useServerNotificationEffect } from '../../../../node_modules/lean4-infoview/src/infoview/util';
+
+import '../../css/infoview.css'
+import { useGetGameInfoQuery } from '../../state/api'
+import { GameHint } from './Defs'
+import { MoreHelpButton, filterHints } from '../chat'
+// import { isLastStepWithErrors, lastStepHasErrors, loadGoals } from '../infoview/goals'
+// import { getInteractiveDiagsAt, hasInteractiveErrors } from '../infoview/typewriter'
+// import { Errors } from '../infoview/messages'
+import { Button, Markdown } from '../utils'
+// import { Command, GoalsTabs } from '../infoview/main'
+import { CircularProgress } from '@mui/material'
+
+/** The input field */
+export function TypewriterInput({disabled}: {disabled?: boolean}) {
+ let { t } = useTranslation()
+
+ /** Reference to the hidden multi-line editor */
+ const editor = React.useContext(MonacoEditorContext)
+ const model = editor.getModel()
+ const uri = model.uri.toString()
+
+ const [oneLineEditor, setOneLineEditor] = useState(null)
+ const [processing, setProcessing] = useState(false)
+
+ const {typewriterInput, setTypewriterInput} = React.useContext(InputModeContext)
+
+ const inputRef = useRef()
+
+ // The context storing all information about the current proof
+ const {proof, setProof, interimDiags, setInterimDiags, setCrashed} = React.useContext(ProofContext)
+
+ // state to store the last batch of deleted messages
+ const {setDeletedChat} = React.useContext(DeletedChatContext)
+
+ const rpcSess = React.useContext(RpcContext)
+
+ // Run the command
+ const runCommand = React.useCallback(() => {
+ if (processing) {return}
+
+ // TODO: Desired logic is to only reset this after a new *error-free* command has been entered
+ setDeletedChat([])
+
+ const pos = editor.getPosition()
+ if (typewriterInput) {
+ setProcessing(true)
+ editor.executeEdits("typewriter", [{
+ range: monaco.Selection.fromPositions(
+ pos,
+ editor.getModel().getFullModelRange().getEndPosition()
+ ),
+ text: typewriterInput.trim() + "\n",
+ forceMoveMarkers: false
+ }])
+ setTypewriterInput('')
+ // Load proof after executing edits
+ loadGoals(rpcSess, uri, setProof, setCrashed)
+ }
+
+ editor.setPosition(pos)
+ }, [typewriterInput, editor])
+
+ useEffect(() => {
+ if (oneLineEditor && oneLineEditor.getValue() !== typewriterInput) {
+ oneLineEditor.setValue(typewriterInput)
+ }
+ }, [typewriterInput])
+
+ /* Load proof on start/switching to typewriter */
+ useEffect(() => {
+ loadGoals(rpcSess, uri, setProof, setCrashed)
+ }, [])
+
+ /** If the last step has an error, add the command to the typewriter. */
+ useEffect(() => {
+ if (lastStepHasErrors(proof)) {
+ setTypewriterInput(proof?.steps[proof?.steps.length - 1].command)
+ }
+ }, [proof])
+
+ // React when answer from the server comes back
+ useServerNotificationEffect('textDocument/publishDiagnostics', (params: PublishDiagnosticsParams) => {
+ if (params.uri == uri) {
+ setProcessing(false)
+
+ console.log('Received lean diagnostics')
+ console.log(params.diagnostics)
+ setInterimDiags(params.diagnostics)
+
+ //loadGoals(rpcSess, uri, setProof)
+
+ // TODO: loadAllGoals()
+ if (!hasErrors(params.diagnostics)) {
+ //setTypewriterInput("")
+ editor.setPosition(editor.getModel().getFullModelRange().getEndPosition())
+ }
+ } else {
+ // console.debug(`expected uri: ${uri}, got: ${params.uri}`)
+ // console.debug(params)
+ }
+ // TODO: This is the wrong place apparently. Where do wee need to load them?
+ // TODO: instead of loading all goals every time, we could only load the last one
+ // loadAllGoals()
+ }, [uri]);
+
+ // // React when answer from the server comes back
+ // useServerNotificationEffect('$/game/publishDiagnostics', (params: GameDiagnosticsParams) => {
+ // console.log('Received game diagnostics')
+ // console.log(`diag. uri : ${params.uri}`)
+ // console.log(params.diagnostics)
+
+ // }, [uri]);
+
+
+ useEffect(() => {
+ const myEditor = monaco.editor.create(inputRef.current!, {
+ value: typewriterInput,
+ language: "lean4cmd",
+ quickSuggestions: false,
+ lightbulb: {
+ enabled: true
+ },
+ unicodeHighlight: {
+ ambiguousCharacters: false,
+ },
+ automaticLayout: true,
+ minimap: {
+ enabled: false
+ },
+ lineNumbers: 'off',
+ tabSize: 2,
+ glyphMargin: false,
+ folding: false,
+ lineDecorationsWidth: 0,
+ lineNumbersMinChars: 0,
+ 'semanticHighlighting.enabled': true,
+ overviewRulerLanes: 0,
+ hideCursorInOverviewRuler: true,
+ scrollbar: {
+ vertical: 'hidden',
+ horizontalScrollbarSize: 3
+ },
+ overviewRulerBorder: false,
+ theme: 'vs-code-theme-converted',
+ contextmenu: false
+ })
+
+ setOneLineEditor(myEditor)
+
+ const abbrevRewriter = new AbbreviationRewriter(new AbbreviationProvider(), myEditor.getModel(), myEditor)
+
+ return () => {abbrevRewriter.dispose(); myEditor.dispose()}
+ }, [])
+
+ useEffect(() => {
+ if (!oneLineEditor) return
+ // Ensure that our one-line editor can only have a single line
+ const l = oneLineEditor.getModel().onDidChangeContent((e) => {
+ const value = oneLineEditor.getValue()
+ setTypewriterInput(value)
+ const newValue = value.replace(/[\n\r]/g, '')
+ if (value != newValue) {
+ oneLineEditor.setValue(newValue)
+ }
+ })
+ return () => { l.dispose() }
+ }, [oneLineEditor, setTypewriterInput])
+
+ useEffect(() => {
+ if (!oneLineEditor) return
+ // Run command when pressing enter
+ const l = oneLineEditor.onKeyUp((ev) => {
+ if (ev.code === "Enter") {
+ runCommand()
+ }
+ })
+ return () => { l.dispose() }
+ }, [oneLineEditor, runCommand])
+
+ // BUG: Causes `file closed` error
+ //TODO: Intention is to run once when loading, does that work?
+ useEffect(() => {
+ console.debug(`time to update: ${uri} \n ${rpcSess}`)
+ console.debug(rpcSess)
+ // console.debug('LOAD ALL GOALS')
+ // TODO: loadAllGoals()
+ }, [rpcSess])
+
+ /** Process the entered command */
+ const handleSubmit : React.FormEventHandler = (ev) => {
+ // ev.preventDefault()
+ // runCommand()
+ }
+
+ // do not display if the proof is completed (with potential warnings still present)
+ return
+}
+
+export function TypewriterInterFace() {
+ let { t } = useTranslation()
+ const {gameId, worldId, levelId} = useContext(GameIdContext)
+ const editor = useContext(MonacoEditorContext)
+ const model = editor.getModel()
+ const uri = model.uri.toString()
+
+ const gameInfo = useGetGameInfoQuery({game: gameId})
+ let image: string = gameInfo.data?.worlds.nodes[worldId].image
+
+
+ const [disableInput, setDisableInput] = useState(false)
+ const [loadingProgress, setLoadingProgress] = useState(0)
+ const { selectedStep, setSelectedStep, setDeletedChat, showHelp, setShowHelp } = useContext(ChatContext)
+ const {mobile} = useContext(PreferencesContext)
+ const { proof, setProof, crashed, setCrashed, interimDiags } = useContext(ProofContext)
+ const { setTypewriterInput } = useContext(PageContext)
+
+ const proofPanelRef = React.useRef(null)
+ // const config = useEventResult(ec.events.changedInfoviewConfig) ?? defaultInfoviewConfig;
+ // const curUri = useEventResult(ec.events.changedCursorLocation, loc => loc?.uri);
+
+ const rpcSess = useRpcSessionAtPos({uri: uri, line: 0, character: 0})
+
+ /** Delete all proof lines starting from a given line.
+ * Note that the first line (i.e. deleting everything) is `1`!
+ */
+ function deleteProof(line: number) {
+ return (ev) => {
+ let deletedChat: Array = []
+ proof?.steps.slice(line).map((step, i) => {
+ let filteredHints = filterHints(step.goals[0]?.hints, proof?.steps[i-1]?.goals[0]?.hints)
+
+ // Only add these hidden hints to the deletion stack which were visible
+ deletedChat = [...deletedChat, ...filteredHints.filter(hint => (!hint.hidden || showHelp.has(line + i)))]
+ })
+ setDeletedChat(deletedChat)
+
+ // delete showHelp for deleted steps
+ setShowHelp(new Set(Array.from(showHelp).filter(i => i < line - 1)))
+
+ editor.executeEdits("typewriter", [{
+ range: monaco.Selection.fromPositions(
+ { lineNumber: line, column: 1 },
+ editor.getModel().getFullModelRange().getEndPosition()
+ ),
+ text: '',
+ forceMoveMarkers: false
+ }])
+ setSelectedStep(null)
+ setTypewriterInput(proof?.steps[line].command)
+ // Reload proof on deleting
+ // loadGoals(rpcSess, uri, setProof, setCrashed)
+ ev.stopPropagation()
+ }
+ }
+
+ function toggleSelectStep(line: number) {
+ return (ev) => {
+ if (mobile) {return}
+ if (selectedStep == line) {
+ setSelectedStep(null)
+ console.debug(`unselected step`)
+ } else {
+ setSelectedStep(line)
+ console.debug(`step ${line} selected`)
+ }
+ }
+ }
+
+ // Scroll to the end of the proof if it is updated.
+ React.useEffect(() => {
+ if (proof?.steps.length > 1) {
+ proofPanelRef.current?.lastElementChild?.scrollIntoView() //scrollTo(0,0)
+ } else {
+ proofPanelRef.current?.scrollTo(0,0)
+ }
+ // also reenable the commandline when the proof changes
+
+ // BUG: If selecting 2nd goal on a intermediate proofstep and then delete proof to there,
+ // the commandline is not displaying disabled even though it should.
+ setDisableInput(false)
+ }, [proof])
+
+ // Scroll to element if selection changes
+ React.useEffect(() => {
+ if (typeof selectedStep !== 'undefined') {
+ Array.from(proofPanelRef.current?.getElementsByClassName(`step-${selectedStep}`)).map((elem) => {
+ elem.scrollIntoView({ block: "center" })
+ })
+ }
+ }, [selectedStep])
+
+ // TODO: superfluous, can be replaced with `withErr` from above
+ let lastStepErrors = proof?.steps.length //? hasInteractiveErrors(getInteractiveDiagsAt(proof, proof?.steps.length)) : false
+
+
+ useServerNotificationEffect("$/game/loading", (params : any) => {
+ if (params.kind == "loadConstants") {
+ setLoadingProgress(params.counter/100*50)
+ } else if (params.kind == "finalizeExtensions") {
+ setLoadingProgress(50 + params.counter/150*50)
+ } else {
+ console.error(`Unknown loading kind: ${params.kind}`)
+ }
+ })
+
+ return
+
+
+ {/*
+ {image &&
+
+ }
+
+
*/}
+ {/*
*/}
+
+ {/*
*/}
+ {crashed ?
+
{t("Crashed! Go to editor mode and fix your proof! Last server response:")}
+ {interimDiags.map(diag => {
+ const severityClass = diag.severity ? {
+ [DiagnosticSeverity.Error]: 'error',
+ [DiagnosticSeverity.Warning]: 'warning',
+ [DiagnosticSeverity.Information]: 'information',
+ [DiagnosticSeverity.Hint]: 'hint',
+ }[diag.severity] : '';
+
+ return
+
+
{t("Line")} {diag.range.start.line}, {t("Character")} {diag.range.start.character}
+
+ {diag.message}as React
+
+
+
+ })}
+
+
: proof?.steps.length ?
+ <>
+ {proof?.steps.map((step, i) => {
+ let filteredHints = filterHints(step.goals[0]?.hints, proof?.steps[i-1]?.goals[0]?.hints)
+
+ // if (i == proof?.steps.length - 1 && hasInteractiveErrors(step.diags)) {
+ // // if the last command contains an error, we only display the errors but not the
+ // // entered command as it is still present in the command line.
+ // // TODO: Should not use index as key.
+ // return
+ //
+ //
+ // } else {
+
+ //
+ //
+ return
+ {i > 0 && <>
+
+ >}
+ {/* {mobile && i == 0 && props.data?.introduction &&
+
+ {props.data?.introduction}
+
+ }
+ {mobile &&
+
({hint: hint, step: i}))} />
+ } */}
+ {/* setDisableInput(n > 0) : (n) => {}}/> */}
+ {/* {!(isLastStepWithErrors(proof, i)) &&
+ setDisableInput(n > 0) : (n) => {}}/>
+ } */}
+ {mobile && i == proof?.steps.length - 1 &&
+
+ }
+
+ {/* Show a message that there are no goals left */}
+ {/* {!step.goals.length && (
+
+ {proof?.completed ?
+
Level completed! 🎉
:
+
+ no goals left
+ This probably means you solved the level with warnings or Lean encountered a parsing error.
+
+ }
+
+ )} */}
+
+ }
+ //}
+ )}
+ {proof?.diagnostics.length > 0 &&
+
+ {/* */}
+
+ }
+ {mobile && proof?.completed &&
+
+ {/* {props.level >= props.worldSize ?
+
+ {t("Home")}
+
+ :
+
+ Next
+
+ } */}
+
+ }
+ > :
+ // note: since we don't know the total number of files,
+ // we use a function which strictly monotonely increases towards `100` as `x → ∞`
+ // The base is chosen at random s.t. we get roughly 91% for `x = 100`.
+ }
+
+
+ {/* */}
+
+
+
+}
diff --git a/client/src/components/editor/tmp.tsx b/client/src/components/editor/tmp.tsx
new file mode 100644
index 00000000..9ca44391
--- /dev/null
+++ b/client/src/components/editor/tmp.tsx
@@ -0,0 +1,77 @@
+import { VSCodeButton } from '@vscode/webview-ui-toolkit/react'
+import * as React from 'react'
+import * as ReactDOM from 'react-dom/client'
+import type { DidCloseTextDocumentParams, DocumentUri, Location } from 'vscode-languageserver-protocol'
+
+import '@vscode/codicons/dist/codicon.css'
+import '@vscode/codicons/dist/codicon.ttf'
+import 'tachyons/css/tachyons.css'
+// import './index.css'
+
+import {
+ defaultInfoviewConfig,
+ EditorApi,
+ InfoviewApi,
+ LeanFileProgressParams,
+ LeanFileProgressProcessingInfo,
+} from '@leanprover/infoview-api'
+
+import { ConfigContext, EditorContext, ProgressContext, VersionContext } from './infoview/contexts'
+import { EditorConnection, EditorEvents } from './infoview/editorConnection'
+import { EventEmitter } from './infoview/event'
+import { Infos } from './infoview/infos'
+import { AllMessages, WithLspDiagnosticsContext } from './infoview/messages'
+import { WithRpcSessions } from './infoview/rpcSessions'
+import { ServerVersion } from './infoview/serverVersion'
+import { useClientNotificationEffect, useEventResult, useServerNotificationState } from './infoview/util'
+
+import { useTranslation } from 'react-i18next'
+import { Main } from './infoview/main'
+
+/** The input field */
+export function GameInfoview({editorApi}: {editorApi: EditorApi}) {
+ let { t } = useTranslation()
+
+ const editorEvents: EditorEvents = {
+ initialize: new EventEmitter(),
+ gotServerNotification: new EventEmitter(),
+ sentClientNotification: new EventEmitter(),
+ serverRestarted: new EventEmitter(),
+ serverStopped: new EventEmitter(),
+ changedCursorLocation: new EventEmitter(),
+ changedInfoviewConfig: new EventEmitter(),
+ runTestScript: new EventEmitter(),
+ requestedAction: new EventEmitter(),
+ goToDefinition: new EventEmitter(),
+ }
+
+ // Challenge: write a type-correct fn from `Eventify` to `T` without using `any`
+ const infoviewApi: InfoviewApi = {
+ initialize: async l => editorEvents.initialize.fire(l),
+ gotServerNotification: async (method, params) => {
+ editorEvents.gotServerNotification.fire([method, params])
+ },
+ sentClientNotification: async (method, params) => {
+ editorEvents.sentClientNotification.fire([method, params])
+ },
+ serverRestarted: async r => editorEvents.serverRestarted.fire(r),
+ serverStopped: async serverStoppedReason => {
+ editorEvents.serverStopped.fire(serverStoppedReason)
+ },
+ changedCursorLocation: async loc => editorEvents.changedCursorLocation.fire(loc),
+ changedInfoviewConfig: async conf => editorEvents.changedInfoviewConfig.fire(conf),
+ requestedAction: async action => editorEvents.requestedAction.fire(action, action.kind),
+ goToDefinition: async id => editorEvents.goToDefinition.fire(id, id),
+ // See https://rollupjs.org/guide/en/#avoiding-eval
+ // eslint-disable-next-line @typescript-eslint/no-implied-eval
+ runTestScript: async script => new Function(script)(),
+ getInfoviewHtml: async () => document.body.innerHTML,
+ }
+ const ec = new EditorConnection(editorApi, editorEvents)
+
+ editorEvents.initialize.on((loc: Location) => ec.events.changedCursorLocation.fire(loc))
+
+ return
+
+
+}
diff --git a/client/src/components/error_page.tsx b/client/src/components/error_page.tsx
index 3dbeb62e..67b7c9f1 100644
--- a/client/src/components/error_page.tsx
+++ b/client/src/components/error_page.tsx
@@ -1,17 +1,24 @@
import * as React from 'react'
import { useRouteError } from "react-router-dom";
+import '../css/error_page.css'
+/** The fallback error page */
export default function ErrorPage() {
- const error: any = useRouteError();
- console.error(error);
+ const error: any = useRouteError()
+ console.error(error)
return (
-
Oops!
-
Sorry, an unexpected error has occurred.
-
- {error.statusText || error.message}
-
+
+
Oops!
+
Something unexpected happened:
+
({error.status}) {error.statusText || error.message} {error.data}
+
Please create an issue at the lean4game repo .
+
+
+
+
+
- );
+ )
}
diff --git a/client/src/components/flag.tsx b/client/src/components/flag.tsx
new file mode 100644
index 00000000..3cf772fc
--- /dev/null
+++ b/client/src/components/flag.tsx
@@ -0,0 +1,14 @@
+import * as React from 'react'
+import ReactCountryFlag from 'react-country-flag'
+import lean4gameConfig from '../config.json'
+
+/** Displays either a flag or the language-code, depending on the settings.
+ * The argument `iso` is an ISO-language code.
+ */
+export const Flag : React.FC<{ iso: string, showTitle?: boolean}> = ({iso, showTitle=false}) => {
+ let lang = lean4gameConfig.languages[iso]
+ if (lean4gameConfig.useFlags && lang) {
+ return
+ }
+ return {iso}
+}
diff --git a/client/src/components/game.tsx b/client/src/components/game.tsx
new file mode 100644
index 00000000..2670b973
--- /dev/null
+++ b/client/src/components/game.tsx
@@ -0,0 +1,108 @@
+import * as React from 'react'
+import { useContext, useEffect, useRef, useState } from 'react'
+import Split from 'react-split'
+
+import { useAppDispatch, useAppSelector } from '../hooks'
+import { changeTypewriterMode, selectCode, selectSelections, selectTypewriterMode } from '../state/progress'
+import { useGetGameInfoQuery, useLoadInventoryOverviewQuery, useLoadLevelQuery } from '../state/api'
+import { ChatContext, GameIdContext, PageContext, PreferencesContext, ProofContext } from '../state/context'
+import { InventoryPanel } from './inventory'
+import { WorldTreePanel } from './world_tree'
+
+import i18next from 'i18next'
+import { ChatPanel } from './chat'
+import { NewLevel } from './level'
+import { GameHint, ProofState } from './editor/Defs'
+import { useSelector } from 'react-redux'
+import { Diagnostic } from 'vscode-languageserver-types'
+
+import '../css/game.css'
+import '../css/welcome.css'
+import '../css/level.css'
+
+/** main page of the game showing among others the tree of worlds/levels */
+function Game() {
+
+ const dispatch = useAppDispatch()
+ const { gameId, worldId, levelId } = React.useContext(GameIdContext)
+
+ // Load the namespace of the game
+ i18next.loadNamespaces(gameId)
+
+ const {mobile} = useContext(PreferencesContext)
+ const {isSavePreferences, language, setIsSavePreferences, setLanguage} = React.useContext(PreferencesContext)
+
+ const gameInfo = useGetGameInfoQuery({game: gameId})
+ const levelInfo = useLoadLevelQuery({game: gameId, world: worldId, level: levelId})
+ const inventory = useLoadInventoryOverviewQuery({game: gameId})
+
+ const {page, setPage} = useContext(PageContext)
+
+ const chatRef = useRef(null)
+ // When deleting the proof, we want to keep to old messages around until
+ // a new proof has been entered. e.g. to consult messages coming from dead ends
+ const [deletedChat, setDeletedChat] = useState>([])
+ // A set of row numbers where help is displayed
+ const [showHelp, setShowHelp] = useState>(new Set())
+ // Select and highlight proof steps and corresponding hints
+ // TODO: with the new design, there is no difference between the introduction and
+ // a hint at the beginning of the proof...
+ const [selectedStep, setSelectedStep] = useState(null)
+
+ // The state variables for the `ProofContext`
+ const [proof, setProof] = useState({steps: [], diagnostics: [], completed: false, completedWithWarnings: false})
+ const [interimDiags, setInterimDiags] = useState>([])
+ const [isCrashed, setIsCrashed] = useState(false)
+
+ const typewriterMode = useSelector(selectTypewriterMode(gameId))
+ const setTypewriterMode = (newTypewriterMode: boolean) => dispatch(changeTypewriterMode({game: gameId, typewriterMode: newTypewriterMode}))
+
+ const initialCode = useAppSelector(selectCode(gameId, worldId, levelId))
+ const initialSelections = useAppSelector(selectSelections(gameId, worldId, levelId))
+
+ // set the window title
+ useEffect(() => {
+ if (gameInfo.data?.title) {
+ window.document.title = gameInfo.data.title
+ }
+ }, [gameInfo.data?.title])
+
+ // Delete the current proof on changing level
+ useEffect(() => {
+ setProof(null)
+ setSelectedStep(null)
+ setDeletedChat([])
+ setShowHelp(new Set())
+ }, [gameId, worldId, levelId])
+
+ return
+
+ { mobile ?
+
+
+ { worldId ?
+ :
+
+ }
+
+
+ :
+
+
+
+ {/* Note: apparently without this `div` the split panel bugs out. */}
+ {worldId ?
+
+ : }
+
+
+
+ }
+
+
+}
+
+export default Game
+function useLevelEditor(codeviewRef: React.MutableRefObject, initialCode: any, initialSelections: any, onDidChangeContent: any, onDidChangeSelection: any): { editor: any; infoProvider: any; editorConnection: any } {
+ throw new Error('Function not implemented.')
+}
diff --git a/client/src/components/hints.tsx b/client/src/components/hints.tsx
deleted file mode 100644
index 5fa5a47c..00000000
--- a/client/src/components/hints.tsx
+++ /dev/null
@@ -1,125 +0,0 @@
-import { GameHint, InteractiveGoalsWithHints, ProofState } from "./infoview/rpc_api";
-import * as React from 'react';
-import Markdown from './markdown';
-import { DeletedChatContext, ProofContext } from "./infoview/context";
-import { lastStepHasErrors } from "./infoview/goals";
-import { Button } from "./button";
-import { useTranslation } from "react-i18next";
-import { GameIdContext } from "../app";
-
-/** Plug-in the variable names in a hint. We do this client-side to prepare
- * for i18n in the future. i.e. one should be able translate the `rawText`
- * and have the variables substituted just before displaying.
- */
-function getHintText(hint: GameHint): string {
- const gameId = React.useContext(GameIdContext)
- let { t } = useTranslation()
- if (hint.rawText) {
- // Replace the variable names used in the hint with the ones used by the player
- // variable names are marked like `«{g}»` inside the text.
- return t(hint.rawText, {ns: gameId}).replaceAll(/«\{(.*?)\}»/g, ((_, v) =>
- // `hint.varNames` contains tuples `[oldName, newName]`
- (hint.varNames.find(x => x[0] == v))[1]))
- } else {
- // hints created in the frontend do not have a `rawText`
- // TODO: `hint.text` could be removed in theory.
- return t(hint.text, {ns: gameId})
- }
-}
-
-export function Hint({hint, step, selected, toggleSelection, lastLevel} : {hint: GameHint, step: number, selected: number, toggleSelection: any, lastLevel?: boolean}) {
- return
- {getHintText(hint)}
-
-}
-
-export function HiddenHint({hint, step, selected, toggleSelection, lastLevel} : {hint: GameHint, step: number, selected: number, toggleSelection: any, lastLevel?: boolean}) {
- return
- {getHintText(hint)}
-
-}
-
-export function Hints({hints, showHidden, step, selected, toggleSelection, lastLevel} : {hints: GameHint[], showHidden: boolean, step: number, selected: number, toggleSelection: any, lastLevel?: boolean}) {
- if (!hints) {return <>>}
- const openHints = hints.filter(hint => !hint.hidden)
- const hiddenHints = hints.filter(hint => hint.hidden)
-
- // TODO: Should not use index as key.
- return <>
- {openHints.map((hint, j) => )}
- {showHidden && hiddenHints.map((hint, j) => )}
- >
-}
-
-export function DeletedHint({hint} : {hint: GameHint}) {
- return
- {getHintText(hint)}
-
-}
-
-export function DeletedHints({hints} : {hints: GameHint[]}) {
-
- const openHints = hints.filter(hint => !hint.hidden)
- const hiddenHints = hints.filter(hint => hint.hidden)
-
- // TODO: Should not use index as key.
- return <>
- {openHints.map((hint, i) => )}
- {hiddenHints.map((hint, i) => )}
- >
-}
-
-/** Filter hints to not show consequtive identical hints twice.
- * Hidden hints are not filtered.
- */
-export function filterHints(hints: GameHint[], prevHints: GameHint[]): GameHint[] {
- if (!hints) {
- return []}
- else if (!prevHints) {
- return hints }
- else {
- return hints.filter((hint) => hint.hidden ||
- (prevHints.find(x => (x.text == hint.text && x.hidden == hint.hidden)) === undefined)
- )
- }
-}
-
-
-function hasHiddenHints(step: InteractiveGoalsWithHints): boolean {
- return step?.goals[0]?.hints.some((hint) => hint.hidden)
-}
-
-
-export function MoreHelpButton({selected=null} : {selected?: number}) {
-
- const { t } = useTranslation()
-
- const {proof, setProof} = React.useContext(ProofContext)
- const {deletedChat, setDeletedChat, showHelp, setShowHelp} = React.useContext(DeletedChatContext)
-
- let k = proof?.steps.length ?
- ((selected === null) ? (proof?.steps.length - (lastStepHasErrors(proof) ? 2 : 1)) : selected)
- : 0
-
- const activateHiddenHints = (ev) => {
- // If the last step (`k`) has errors, we want the hidden hints from the
- // second-to-last step to be affected
- if (!(proof?.steps.length)) {return}
-
- // state must not be mutated, therefore we need to clone the set
- let tmp = new Set(showHelp)
- if (tmp.has(k)) {
- tmp.delete(k)
- } else {
- tmp.add(k)
- }
- setShowHelp(tmp)
- console.debug(`help: ${Array.from(tmp.values())}`)
- }
-
- if (hasHiddenHints(proof?.steps[k]) && !showHelp.has(k)) {
- return
- {t("Show more help!")}
-
- }
-}
diff --git a/client/src/components/infoview/goals.tsx b/client/src/components/infoview/goals.tsx
index 41e79bf6..cec39394 100644
--- a/client/src/components/infoview/goals.tsx
+++ b/client/src/components/infoview/goals.tsx
@@ -4,15 +4,15 @@
* Mostly copied from https://github.com/leanprover/vscode-lean4/blob/master/lean4-infoview/src/infoview/goals.tsx
*/
import * as React from 'react'
-import { InteractiveHypothesisBundle_nonAnonymousNames, MVarId, TaggedText_stripTags } from '@leanprover/infoview-api'
-import { EditorContext } from '../../../../node_modules/lean4-infoview/src/infoview/contexts';
-import { Locations, LocationsContext, SelectableLocation } from '../../../../node_modules/lean4-infoview/src/infoview/goalLocation';
-import { InteractiveCode } from '../../../../node_modules/lean4-infoview/src/infoview/interactiveCode'
-import { WithTooltipOnHover } from '../../../../node_modules/lean4-infoview/src/infoview/tooltips';
-import { InputModeContext } from './context';
+// import { InteractiveHypothesisBundle_nonAnonymousNames, MVarId, TaggedText_stripTags } from '@leanprover/infoview-api'
+// import { EditorContext } from '../../../../node_modules/lean4-infoview/src/infoview/contexts';
+// import { Locations, LocationsContext, SelectableLocation } from '../../../../node_modules/lean4-infoview/src/infoview/goalLocation';
+// import { InteractiveCode } from '../../../../node_modules/lean4-infoview/src/infoview/interactiveCode'
+// import { WithTooltipOnHover } from '../../../../node_modules/lean4-infoview/src/infoview/tooltips';
+import { PageContext } from '../../state/context';
import { InteractiveGoal, InteractiveGoals, InteractiveGoalsWithHints, InteractiveHypothesisBundle, ProofState } from './rpc_api';
-import { RpcSessionAtPos } from '@leanprover/infoview/*';
-import { DocumentPosition } from '../../../../node_modules/lean4-infoview/src/infoview/util';
+// import { RpcSessionAtPos } from '@leanprover/infoview/*';
+// import { DocumentPosition } from '../../../../node_modules/lean4-infoview/src/infoview/util';
import { DiagnosticSeverity } from 'vscode-languageserver-protocol';
import { useTranslation } from 'react-i18next';
@@ -76,7 +76,7 @@ function getFilteredHypotheses(hyps: InteractiveHypothesisBundle[], filter: Goal
interface HypProps {
hyp: InteractiveHypothesisBundle
- mvarId?: MVarId
+ mvarId?: any // MVarId
}
function Hyp({ hyp: h, mvarId }: HypProps) {
@@ -133,13 +133,14 @@ interface GoalProps {
filter: GoalFilterState
showHints?: boolean
typewriter: boolean
+ unbundle?: boolean /** unbundle `x y : Nat` into `x : Nat` and `y : Nat` */
}
/**
* Displays the hypotheses, target type and optional case label of a goal according to the
* provided `filter`. */
export const Goal = React.memo((props: GoalProps) => {
- const { goal, filter, showHints, typewriter } = props
+ const { goal, filter, showHints, typewriter, unbundle } = props
let { t } = useTranslation()
// TODO: Apparently `goal` can be `undefined`
@@ -153,8 +154,8 @@ export const Goal = React.memo((props: GoalProps) => {
{ ...locs, subexprTemplate: { mvarId: goal.mvarId, loc: { target: '' }}} :
undefined,
[locs, goal.mvarId])
- const goalLi =
-
{t("Goal")}:
+ const goalLi =
+ {/*
{t("Goal")}:
*/}
@@ -164,22 +165,38 @@ export const Goal = React.memo((props: GoalProps) => {
// if (props.goal.isInserted) cn += 'b--inserted '
// if (props.goal.isRemoved) cn += 'b--removed '
+ function unbundleHyps (hyps: InteractiveHypothesisBundle[]) : InteractiveHypothesisBundle[] {
+ return hyps.flatMap(hyp => (
+ unbundle ? hyp.names.map(name => {return {...hyp, names: [name]}}) : [hyp]
+ ))
+ }
+
// const hints =
- const objectHyps = hyps.filter(hyp => !hyp.isAssumption)
- const assumptionHyps = hyps.filter(hyp => hyp.isAssumption)
+ const objectHyps = unbundleHyps(hyps.filter(hyp => !hyp.isAssumption))
+ const assumptionHyps = unbundleHyps(hyps.filter(hyp => hyp.isAssumption))
- return
+ return <>
{/* {goal.userName &&
case {goal.userName}
} */}
{filter.reverse && goalLi}
+
{! typewriter && objectHyps.length > 0 &&
{t("Objects")}:
{objectHyps.map((h, i) =>
)}
}
{!typewriter && assumptionHyps.length > 0 &&
{t("Assumptions")}:
{assumptionHyps.map((h, i) =>
)}
}
- {!filter.reverse && goalLi}
+
+ {!filter.reverse && <>
+
+
+
+
+
+
+ {goalLi}
+ >}
{/* {showHints && hints} */}
-
+ >
})
export const MainAssumptions = React.memo((props: GoalProps2) => {
diff --git a/client/src/components/infoview/info.tsx b/client/src/components/infoview/info.tsx
index 3ade899f..6f4f264b 100644
--- a/client/src/components/infoview/info.tsx
+++ b/client/src/components/infoview/info.tsx
@@ -13,10 +13,11 @@ import { RpcContext, useRpcSessionAtPos } from '../../../../node_modules/lean4-i
import { GoalsLocation, Locations, LocationsContext } from '../../../../node_modules/lean4-infoview/src/infoview/goalLocation'
import { AllMessages, lspDiagToInteractive } from './messages'
-import { goalsToString, Goal, MainAssumptions, OtherGoals } from './goals'
+// import { goalsToString, Goal, MainAssumptions, OtherGoals } from './goals'
import { InteractiveTermGoal, InteractiveGoalsWithHints, InteractiveGoals, ProofState } from './rpc_api'
-import { MonacoEditorContext, ProofStateProps, InfoStatus, ProofContext } from './context'
+import { MonacoEditorContext, ProofStateProps, InfoStatus, ProofContext } from '../../state/context'
import { useTranslation } from 'react-i18next'
+import { GoalsTabs } from './main'
// TODO: All about pinning could probably be removed
type InfoKind = 'cursor' | 'pin'
@@ -123,37 +124,39 @@ const InfoDisplayContent = React.memo((props: InfoDisplayContentProps) => {
Error updating:{' '}{error}.
{ e.preventDefault(); void triggerUpdate() }}>{' '}Try again.
}
+
{/* TODO: Move error messages to Chat instead */}
+
{ goals && goals.goals.length > 0 && <>
-
-
+ ({goal: goal, hints: []}))} last={false} onClick={() => {}} onGoalChange={() => {}}/>
+ {/*
+ */}
>}
-
+ {/*
{ goals && (goals.goals.length > 0
?
:
{t("No Goals")}
)}
-
+
*/}
- {userWidgets.map(widget =>
+ {/* {userWidgets.map(widget =>
{widget.name}
- )}
- {nothingToShow && (
+ )} */}
+ {/* {nothingToShow && (
isPaused ?
- /* Adding {' '} to manage string literals properly: https://reactjs.org/docs/jsx-in-depth.html#string-literals-1 */
+ /* Adding {' '} to manage string literals properly: https://reactjs.org/docs/jsx-in-depth.html#string-literals-1 * /
Updating is paused.{' '}
{ e.preventDefault(); void triggerUpdate() }}>Refresh
{' '}or { e.preventDefault(); setPaused(false) }}>resume updating
{' '}to see information.
:
- <>
{t("Loading goal…")}
>)}
-
+ <>
{t("Loading goal…")}
>)} */}
{/*
{goals && goals.goals.length > 1 &&
Weitere Goals
diff --git a/client/src/components/infoview/main.tsx b/client/src/components/infoview/main.tsx
index 11616526..8743ceb3 100644
--- a/client/src/components/infoview/main.tsx
+++ b/client/src/components/infoview/main.tsx
@@ -9,36 +9,35 @@ import '../../../../node_modules/lean4-infoview/src/infoview/index.css';
import '../../css/infoview.css'
import { LeanFileProgressParams, LeanFileProgressProcessingInfo, defaultInfoviewConfig, EditorApi, InfoviewApi } from '@leanprover/infoview-api';
-import { useClientNotificationEffect, useServerNotificationEffect, useEventResult, useServerNotificationState } from '../../../../node_modules/lean4-infoview/src/infoview/util';
-import { EditorContext, ConfigContext, ProgressContext, VersionContext } from '../../../../node_modules/lean4-infoview/src/infoview/contexts';
-import { RpcContext, WithRpcSessions, useRpcSessionAtPos } from '../../../../node_modules/lean4-infoview/src/infoview/rpcSessions';
-import { ServerVersion } from '../../../../node_modules/lean4-infoview/src/infoview/serverVersion';
+import { useClientNotificationEffect, useServerNotificationEffect, useEventResult, useServerNotificationState } from '../../../../node_modules/@leanprover/infoview/dist/infoview/util';
+import { EditorContext, ConfigContext, ProgressContext, VersionContext } from '../../../../node_modules/@leanprover/infoview/dist/infoview/contexts';
+import { RpcContext, WithRpcSessions, useRpcSessionAtPos } from '../../../../node_modules/@leanprover/infoview/dist/infoview/rpcSessions';
+import { ServerVersion } from '../../../../node_modules/@leanprover/infoview/dist/infoview/serverVersion';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
import { faDeleteLeft, faHome, faArrowRight, faArrowLeft, faRotateLeft } from '@fortawesome/free-solid-svg-icons'
import * as monaco from 'monaco-editor/esm/vs/editor/editor.api.js'
-import { GameIdContext } from '../../app';
import { useAppDispatch, useAppSelector } from '../../hooks';
-import { LevelInfo, useGetGameInfoQuery } from '../../state/api';
+import { LevelInfo, useGetGameInfoQuery, useLoadLevelQuery } from '../../state/api';
import { changedInventory, levelCompleted, selectCode, selectCompleted, selectInventory } from '../../state/progress';
-import Markdown from '../markdown';
import { Infos } from './infos';
import { AllMessages, Errors, WithLspDiagnosticsContext } from './messages';
import { Goal, isLastStepWithErrors, lastStepHasErrors, loadGoals } from './goals';
-import { DeletedChatContext, InputModeContext, PreferencesContext, MonacoEditorContext, ProofContext, SelectionContext, WorldLevelIdContext } from './context';
+import { ChatContext, PageContext, PreferencesContext, MonacoEditorContext, ProofContext, GameIdContext } from '../../state/context';
import { Typewriter, getInteractiveDiagsAt, hasErrors, hasInteractiveErrors } from './typewriter';
-import { InteractiveDiagnostic } from '@leanprover/infoview/*';
-import { Button } from '../button';
+// import { InteractiveDiagnostic } from '@leanprover/infoview/*';
import { CircularProgress } from '@mui/material';
-import { GameHint, InteractiveGoalsWithHints, ProofState } from './rpc_api';
+// import { GameHint, InteractiveGoalWithHints, InteractiveGoalsWithHints, ProofState } from './rpc_api';
import { store } from '../../state/store';
-import { Hints, MoreHelpButton, filterHints } from '../hints';
-import { DocumentPosition } from '../../../../node_modules/lean4-infoview/src/infoview/util';
+import { DocumentPosition } from '../../../../node_modules/@leanprover/infoview/dist/infoview/util';
import { DiagnosticSeverity } from 'vscode-languageclient';
import { useTranslation } from 'react-i18next';
import path from 'path';
+import { useContext } from 'react';
+import { Hints, MoreHelpButton, filterHints } from '../chat';
+import { Button, Markdown } from '../utils'
/** Wrapper for the two editors. It is important that the `div` with `codeViewRef` is
@@ -46,10 +45,10 @@ import path from 'path';
*/
export function DualEditor({ level, codeviewRef, levelId, worldId, worldSize }) {
const ec = React.useContext(EditorContext)
- const { typewriterMode, lockEditorMode } = React.useContext(InputModeContext)
+ const { typewriterMode, lockEditorMode } = React.useContext(PageContext)
return <>
{ec ?
@@ -63,8 +62,8 @@ export function DualEditor({ level, codeviewRef, levelId, worldId, worldSize })
/** The part of the two editors that needs the editor connection first */
function DualEditorMain({ worldId, levelId, level, worldSize }: { worldId: string, levelId: number, level: LevelInfo, worldSize: number }) {
const ec = React.useContext(EditorContext)
- const gameId = React.useContext(GameIdContext)
- const { typewriterMode, lockEditorMode } = React.useContext(InputModeContext)
+ const {gameId} = React.useContext(GameIdContext)
+ const { typewriterMode, lockEditorMode } = React.useContext(PageContext)
const {proof, setProof} = React.useContext(ProofContext)
@@ -77,7 +76,7 @@ function DualEditorMain({ worldId, levelId, level, worldSize }: { worldId: strin
// On completion, add the names of all new items to the local storage
let newTiles = [
...level?.tactics,
- ...level?.lemmas,
+ ...level?.theorems,
...level?.definitions
].filter((tile) => tile.new).map((tile) => tile.name)
@@ -135,20 +134,24 @@ function DualEditorMain({ worldId, levelId, level, worldSize }: { worldId: strin
*
* If `showLeanStatement` is true, it will additionally display the lean code.
*/
-function ExerciseStatement({ data, showLeanStatement = false }) {
+export function ExerciseStatement({ showLeanStatement = false }) {
let { t } = useTranslation()
- const gameId = React.useContext(GameIdContext)
+ const {gameId, worldId, levelId } = React.useContext(GameIdContext)
+ const levelInfo = useLoadLevelQuery({game: gameId, world: worldId, level: levelId})
- if (!(data?.descrText || data?.descrFormat)) { return <>> }
+ if (!(levelInfo.data?.descrText || levelInfo.data?.descrFormat)) { return <>> }
return <>
- {data?.descrText &&
+ {levelInfo.data?.descrText ?
- {(data?.displayName ? `**Theorem** \`${data?.displayName}\`: ` : '') + t(data?.descrText, {ns: gameId})}
+ {(levelInfo.data?.displayName ? `**${t("Theorem")}** \`${levelInfo.data?.displayName}\`: ` : '') + t(levelInfo.data?.descrText, {ns: gameId})}
+ : levelInfo.data?.displayName &&
+
+ {`**${t("Theorem")}** \`${levelInfo.data?.displayName}\``}
}
- {data?.descrFormat && showLeanStatement &&
-
{data?.descrFormat}
+ {levelInfo.data?.descrFormat && showLeanStatement &&
+
{levelInfo.data?.descrFormat}
}
>
@@ -159,19 +162,16 @@ function ExerciseStatement({ data, showLeanStatement = false }) {
export function Main(props: { world: string, level: number, data: LevelInfo}) {
let { t } = useTranslation()
const ec = React.useContext(EditorContext);
- const gameId = React.useContext(GameIdContext)
- const {worldId, levelId} = React.useContext(WorldLevelIdContext)
+ const {gameId, worldId, levelId} = React.useContext(GameIdContext)
const { proof, setProof } = React.useContext(ProofContext)
- const {selectedStep, setSelectedStep} = React.useContext(SelectionContext)
- const { setDeletedChat, showHelp, setShowHelp } = React.useContext(DeletedChatContext)
-
+ const {selectedStep, setSelectedStep, setDeletedChat, showHelp, setShowHelp} = React.useContext(ChatContext)
function toggleSelection(line: number) {
return (ev) => {
console.debug('toggled selection')
if (selectedStep == line) {
- setSelectedStep(undefined)
+ setSelectedStep(null)
} else {
setSelectedStep(line)
}
@@ -246,11 +246,11 @@ export function Main(props: { world: string, level: number, data: LevelInfo}) {
}
-
-
+ */}
}
@@ -266,7 +266,7 @@ const goalFilter = {
}
/** The display of a single entered lean command */
-function Command({ proof, i, deleteProof }: { proof: ProofState, i: number, deleteProof: any }) {
+export function Command({ proof, i, deleteProof }: { proof: ProofState, i: number, deleteProof: any }) {
let {t} = useTranslation()
// The first step will always have an empty command
@@ -311,7 +311,7 @@ function Command({ proof, i, deleteProof }: { proof: ProofState, i: number, dele
// message = diag.message
// }
-// const { typewriterMode } = React.useContext(InputModeContext)
+// const { typewriterMode } = React.useContext(PageContext)
// return (
// //
@@ -339,18 +339,18 @@ function Command({ proof, i, deleteProof }: { proof: ProofState, i: number, dele
// )
// }, fastIsEqual)
-/** The tabs of goals that lean ahs after the command of this step has been processed */
-function GoalsTabs({ proofStep, last, onClick, onGoalChange=(n)=>{}}: { proofStep: InteractiveGoalsWithHints, last : boolean, onClick? : any, onGoalChange?: (n?: number) => void }) {
+/** The tabs of goals that lean has after the command of this step has been processed */
+export function GoalsTabs({ goals, last, onClick, onGoalChange=(n)=>{}}: { goals: InteractiveGoalWithHints[], last : boolean, onClick? : any, onGoalChange?: (n?: number) => void }) {
let { t } = useTranslation()
const [selectedGoal, setSelectedGoal] = React.useState(0)
- if (proofStep.goals.length == 0) {
+ if (goals.length == 0) {
return <>>
}
return
- {proofStep.goals.map((goal, i) => (
+ {goals.map((goal, i) => (
// TODO: Should not use index as key.
{ onGoalChange(i); setSelectedGoal(i); ev.stopPropagation() }}>
{i ? t("Goal") + ` ${i + 1}` : t("Active Goal")}
@@ -358,7 +358,7 @@ function GoalsTabs({ proofStep, last, onClick, onGoalChange=(n)=>{}}: { proofSte
))}
-
+
}
@@ -366,7 +366,7 @@ function GoalsTabs({ proofStep, last, onClick, onGoalChange=(n)=>{}}: { proofSte
// Splitting up Typewriter into two parts is a HACK
export function TypewriterInterfaceWrapper(props: { world: string, level: number, data: LevelInfo, worldSize: number }) {
const ec = React.useContext(EditorContext)
- const gameId = React.useContext(GameIdContext)
+ const {gameId} = React.useContext(GameIdContext)
useClientNotificationEffect(
'textDocument/didClose',
@@ -400,23 +400,21 @@ export function TypewriterInterfaceWrapper(props: { world: string, level: number
export function TypewriterInterface({props}) {
let { t } = useTranslation()
const ec = React.useContext(EditorContext)
- const gameId = React.useContext(GameIdContext)
+ const {gameId,worldId, levelId} = React.useContext(GameIdContext)
const editor = React.useContext(MonacoEditorContext)
const model = editor.getModel()
const uri = model.uri.toString()
const gameInfo = useGetGameInfoQuery({game: gameId})
- const {worldId, levelId} = React.useContext(WorldLevelIdContext)
let image: string = gameInfo.data?.worlds.nodes[worldId].image
const [disableInput, setDisableInput] = React.useState
(false)
const [loadingProgress, setLoadingProgress] = React.useState(0)
- const { setDeletedChat, showHelp, setShowHelp } = React.useContext(DeletedChatContext)
+ const { selectedStep, setSelectedStep, setDeletedChat, showHelp, setShowHelp } = React.useContext(ChatContext)
const {mobile} = React.useContext(PreferencesContext)
const { proof, setProof, crashed, setCrashed, interimDiags } = React.useContext(ProofContext)
- const { setTypewriterInput } = React.useContext(InputModeContext)
- const { selectedStep, setSelectedStep } = React.useContext(SelectionContext)
+ const { setTypewriterInput } = React.useContext(PageContext)
const proofPanelRef = React.useRef(null)
// const config = useEventResult(ec.events.changedInfoviewConfig) ?? defaultInfoviewConfig;
@@ -449,7 +447,7 @@ export function TypewriterInterface({props}) {
text: '',
forceMoveMarkers: false
}])
- setSelectedStep(undefined)
+ setSelectedStep(null)
setTypewriterInput(proof?.steps[line].command)
// Reload proof on deleting
loadGoals(rpcSess, uri, setProof, setCrashed)
@@ -461,7 +459,7 @@ export function TypewriterInterface({props}) {
return (ev) => {
if (mobile) {return}
if (selectedStep == line) {
- setSelectedStep(undefined)
+ setSelectedStep(null)
console.debug(`unselected step`)
} else {
setSelectedStep(line)
@@ -510,19 +508,19 @@ export function TypewriterInterface({props}) {
return
-
+ {/*
{image &&
}
-
-
+
*/}
-
+ {/*
*/}
{crashed ?
{t("Crashed! Go to editor mode and fix your proof! Last server response:")}
{interimDiags.map(diag => {
@@ -533,7 +531,7 @@ export function TypewriterInterface({props}) {
[DiagnosticSeverity.Hint]: 'hint',
}[diag.severity] : '';
- return
+ return
{t("Line")} {diag.range.start.line}, {t("Character")} {diag.range.start.character}
@@ -557,8 +555,10 @@ export function TypewriterInterface({props}) {
//
// } else {
return
-
-
+ {i > 0 && <>
+
+
+ >}
{mobile && i == 0 && props.data?.introduction &&
{props.data?.introduction}
@@ -566,12 +566,11 @@ export function TypewriterInterface({props}) {
}
{mobile &&
+ hints={filteredHints.map(hint => ({hint: hint, step: i}))} />
}
{/* setDisableInput(n > 0) : (n) => {}}/> */}
{!(isLastStepWithErrors(proof, i)) &&
- setDisableInput(n > 0) : (n) => {}}/>
+ setDisableInput(n > 0) : (n) => {}}/>
}
{mobile && i == proof?.steps.length - 1 &&
@@ -602,7 +601,7 @@ export function TypewriterInterface({props}) {
{props.level >= props.worldSize ?
- {t("Leave World")}
+ {t("Home")}
:
diff --git a/client/src/components/infoview/messages.tsx b/client/src/components/infoview/messages.tsx
index a6daab87..c1c8f133 100644
--- a/client/src/components/infoview/messages.tsx
+++ b/client/src/components/infoview/messages.tsx
@@ -10,7 +10,7 @@ import { Details } from '../../../../node_modules/lean4-infoview/src/infoview/co
import { InteractiveMessage } from '../../../../node_modules/lean4-infoview/src/infoview/traceExplorer'
import { RpcContext, useRpcSessionAtPos } from '../../../../node_modules/lean4-infoview/src/infoview/rpcSessions'
-import { InputModeContext } from './context'
+import { PageContext } from '../../state/context'
import { useTranslation } from 'react-i18next'
interface MessageViewProps {
@@ -80,7 +80,7 @@ const MessageView = React.memo(({uri, diag}: MessageViewProps) => {
message = diag.message
}
- const { typewriterMode, lockEditorMode } = React.useContext(InputModeContext)
+ const { typewriterMode, lockEditorMode } = React.useContext(PageContext)
return (
//
diff --git a/client/src/components/infoview/typewriter.tsx b/client/src/components/infoview/typewriter.tsx
index 697b1032..8af5c29a 100644
--- a/client/src/components/infoview/typewriter.tsx
+++ b/client/src/components/infoview/typewriter.tsx
@@ -3,24 +3,26 @@ import { useRef, useState, useEffect } from 'react'
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
import { faWandMagicSparkles } from '@fortawesome/free-solid-svg-icons'
import * as monaco from 'monaco-editor/esm/vs/editor/editor.api.js'
-import { Registry } from 'monaco-textmate' // peer dependency
-import { wireTmGrammars } from 'monaco-editor-textmate'
+// import { Registry } from 'monaco-textmate' // peer dependency
+// import { wireTmGrammars } from 'monaco-editor-textmate'
import { DiagnosticSeverity, PublishDiagnosticsParams, DocumentUri } from 'vscode-languageserver-protocol';
import { useServerNotificationEffect } from '../../../../node_modules/lean4-infoview/src/infoview/util';
-import { AbbreviationRewriter } from 'lean4web/client/src/editor/abbreviation/rewriter/AbbreviationRewriter';
-import { AbbreviationProvider } from 'lean4web/client/src/editor/abbreviation/AbbreviationProvider';
-import * as leanSyntax from 'lean4web/client/src/syntaxes/lean.json'
-import * as leanMarkdownSyntax from 'lean4web/client/src/syntaxes/lean-markdown.json'
-import * as codeblockSyntax from 'lean4web/client/src/syntaxes/codeblock.json'
-import languageConfig from 'lean4/language-configuration.json';
+// import { AbbreviationRewriter } from 'lean4web/client/src/editor/abbreviation/rewriter/AbbreviationRewriter';
+// import { AbbreviationProvider } from 'lean4web/client/src/editor/abbreviation/AbbreviationProvider';
+// import * as leanSyntax from 'lean4web/client/src/syntaxes/lean.json'
+// import * as leanMarkdownSyntax from 'lean4web/client/src/syntaxes/lean-markdown.json'
+// import * as codeblockSyntax from 'lean4web/client/src/syntaxes/codeblock.json'
+// import languageConfig from 'lean4/language-configuration.json';
import { InteractiveDiagnostic, RpcSessionAtPos, getInteractiveDiagnostics } from '@leanprover/infoview-api';
import { Diagnostic } from 'vscode-languageserver-types';
import { DocumentPosition } from '../../../../node_modules/lean4-infoview/src/infoview/util';
import { RpcContext } from '../../../../node_modules/lean4-infoview/src/infoview/rpcSessions';
-import { DeletedChatContext, InputModeContext, MonacoEditorContext, ProofContext } from './context'
+import { ChatContext, PageContext, MonacoEditorContext, ProofContext, GameIdContext } from '../../state/context'
import { goalsToString, lastStepHasErrors, loadGoals } from './goals'
-import { GameHint, ProofState } from './rpc_api'
+// import { GameHint, ProofState } from './rpc_api'
import { useTranslation } from 'react-i18next'
+// import { InputAbbreviationRewriter } from '@leanprover/unicode-input-component'
+import ContentEditable from 'react-contenteditable'
export interface GameDiagnosticsParams {
uri: DocumentUri;
@@ -35,6 +37,12 @@ monaco.languages.register({
extensions: ['.leancmd']
})
+// register Monaco languages // TODO: JE. I dont understand why I suddenly had to add this when it worked without before.
+monaco.languages.register({
+ id: 'lean4',
+ extensions: ['.lean']
+})
+
// map of monaco "language id's" to TextMate scopeNames
const grammars = new Map()
grammars.set('lean4', 'source.lean')
@@ -75,21 +83,23 @@ export function Typewriter({disabled}: {disabled?: boolean}) {
/** Reference to the hidden multi-line editor */
const editor = React.useContext(MonacoEditorContext)
- const model = editor.getModel()
- const uri = model.uri.toString()
+ const model = editor?.getModel()
+ const uri = model?.uri.toString()
const [oneLineEditor, setOneLineEditor] = useState(null)
const [processing, setProcessing] = useState(false)
- const {typewriterInput, setTypewriterInput} = React.useContext(InputModeContext)
+ const {typewriterInput, setTypewriterInput} = React.useContext(PageContext)
const inputRef = useRef()
// The context storing all information about the current proof
const {proof, setProof, interimDiags, setInterimDiags, setCrashed} = React.useContext(ProofContext)
+ const {gameId, worldId, levelId} = React.useContext(GameIdContext)
+
// state to store the last batch of deleted messages
- const {setDeletedChat} = React.useContext(DeletedChatContext)
+ const {setDeletedChat} = React.useContext(ChatContext)
const rpcSess = React.useContext(RpcContext)
@@ -100,13 +110,13 @@ export function Typewriter({disabled}: {disabled?: boolean}) {
// TODO: Desired logic is to only reset this after a new *error-free* command has been entered
setDeletedChat([])
- const pos = editor.getPosition()
+ const pos = editor?.getPosition()
if (typewriterInput) {
setProcessing(true)
- editor.executeEdits("typewriter", [{
+ editor?.executeEdits("typewriter", [{
range: monaco.Selection.fromPositions(
pos,
- editor.getModel().getFullModelRange().getEndPosition()
+ editor?.getModel()?.getFullModelRange()?.getEndPosition()
),
text: typewriterInput.trim() + "\n",
forceMoveMarkers: false
@@ -116,7 +126,7 @@ export function Typewriter({disabled}: {disabled?: boolean}) {
loadGoals(rpcSess, uri, setProof, setCrashed)
}
- editor.setPosition(pos)
+ editor?.setPosition(pos)
}, [typewriterInput, editor])
useEffect(() => {
@@ -127,8 +137,9 @@ export function Typewriter({disabled}: {disabled?: boolean}) {
/* Load proof on start/switching to typewriter */
useEffect(() => {
+ setProof(null)
loadGoals(rpcSess, uri, setProof, setCrashed)
- }, [])
+ }, [gameId, worldId, levelId])
/** If the last step has an error, add the command to the typewriter. */
useEffect(() => {
@@ -151,7 +162,7 @@ export function Typewriter({disabled}: {disabled?: boolean}) {
// TODO: loadAllGoals()
if (!hasErrors(params.diagnostics)) {
//setTypewriterInput("")
- editor.setPosition(editor.getModel().getFullModelRange().getEndPosition())
+ editor?.setPosition(editor?.getModel()?.getFullModelRange()?.getEndPosition())
}
} else {
// console.debug(`expected uri: ${uri}, got: ${params.uri}`)
@@ -170,7 +181,6 @@ export function Typewriter({disabled}: {disabled?: boolean}) {
// }, [uri]);
-
useEffect(() => {
const myEditor = monaco.editor.create(inputRef.current!, {
value: typewriterInput,
@@ -201,6 +211,7 @@ export function Typewriter({disabled}: {disabled?: boolean}) {
},
overviewRulerBorder: false,
theme: 'vs-code-theme-converted',
+ fontFamily: "JuliaMono",
contextmenu: false
})
@@ -229,7 +240,7 @@ export function Typewriter({disabled}: {disabled?: boolean}) {
if (!oneLineEditor) return
// Run command when pressing enter
const l = oneLineEditor.onKeyUp((ev) => {
- if (ev.code === "Enter") {
+ if (ev.code === "Enter" || ev.code === "NumpadEnter") {
runCommand()
}
})
diff --git a/client/src/components/inventory.tsx b/client/src/components/inventory.tsx
index a249289f..e38035a8 100644
--- a/client/src/components/inventory.tsx
+++ b/client/src/components/inventory.tsx
@@ -1,172 +1,274 @@
-import * as React from 'react';
-import { useState, useEffect } from 'react';
+import * as React from 'react'
+import { useState, useEffect, createContext, useContext } from 'react';
import '../css/inventory.css'
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
-import { faLock, faBan, faCheck } from '@fortawesome/free-solid-svg-icons'
+import { faLock, faBan, faCheck, faXmark } from '@fortawesome/free-solid-svg-icons'
import { faClipboard } from '@fortawesome/free-regular-svg-icons'
-import { GameIdContext } from '../app';
-import Markdown from './markdown';
-import { useLoadDocQuery, InventoryTile, LevelInfo, InventoryOverview, useLoadInventoryOverviewQuery } from '../state/api';
-import { selectDifficulty, selectInventory } from '../state/progress';
+import { useLoadDocQuery, InventoryTile, useLoadInventoryOverviewQuery, useLoadLevelQuery } from '../state/api';
+import { changedInventory, selectDifficulty, selectInventory } from '../state/progress';
import { store } from '../state/store';
import { useSelector } from 'react-redux';
import { useTranslation } from 'react-i18next';
import { t } from 'i18next';
+import { NavButton } from './navigation';
+import { LoadingIcon, Markdown } from './utils';
+import { GameIdContext } from '../state/context';
+import { useAppDispatch } from '../hooks';
-export function Inventory({levelInfo, openDoc, lemmaTab, setLemmaTab, enableAll=false} :
- {
- levelInfo: LevelInfo|InventoryOverview,
- openDoc: (props: {name: string, type: string}) => void,
- lemmaTab: any,
- setLemmaTab: any,
- enableAll?: boolean,
- }) {
- const { t } = useTranslation()
- return (
-
- {/* TODO: Click on Tactic: show info
- TODO: click on paste icon -> paste into command line */}
-
{t("Tactics")}
- {levelInfo?.tactics &&
-
- }
- {t("Definitions")}
- {levelInfo?.definitions &&
-
- }
- {t("Theorems")}
- {levelInfo?.lemmas &&
-
- }
+/** Context which manages the inventory */
+const InventoryContext = createContext<{
+ theoremTab: string,
+ setTheoremTab: React.Dispatch>,
+ categoryTab: "tactic"|"theorem"|"definition",
+ setCategoryTab: React.Dispatch>,
+ docTile: InventoryTile,
+ setDocTile: React.Dispatch>
+}>({
+ theoremTab: null,
+ setTheoremTab: () => {},
+ categoryTab: "tactic",
+ setCategoryTab: () => {},
+ docTile: null,
+ setDocTile: () => {}
+})
+
+
+/**
+ */
+function InventoryItem({item, name, displayName, locked, disabled, newly, showDoc } :
+ { item: InventoryTile,
+ name: any,
+ displayName: any,
+ locked: any,
+ disabled: any,
+ newly: any,
+ showDoc: any
+ }) {
+ const icon = locked ? :
+ disabled ? : <>>
+ const className = locked ? "locked" : disabled ? "disabled" : newly ? "new" : ""
+ // Note: This is somewhat a hack as the statement of theorems comes currently in the form
+ // `Namespace.statement_name (x y : Nat) : some type`
+ const title = locked ? t("Not unlocked yet") :
+ disabled ? t("Not available in this level") : (item.altTitle ? item.altTitle.substring(item.altTitle.indexOf(' ') + 1) : '')
+
+ const { gameId, worldId, levelId } = React.useContext(GameIdContext)
+ const difficulty = useSelector(selectDifficulty(gameId))
+
+ // local state to show checkmark after pressing the copy button
+ const [copied, setCopied] = useState(false)
+
+ const handleClick = () => {
+ // if ((difficulty == 0) || !locked) {
+ showDoc()
+ // }
+ }
+
+ const copyItemName = (ev) => {
+ navigator.clipboard.writeText(displayName)
+ setCopied(true)
+ setInterval(() => {
+ setCopied(false)
+ }, 3000);
+ ev.stopPropagation()
+ }
+
+ return
+ {icon} {displayName}
+
+ {copied ? : }
- )
+
}
-function InventoryList({items, docType, openDoc, tab=null, setTab=undefined, level=undefined, enableAll=false} :
+
+function InventoryList({ items, tab=null, setTab=()=>{} } :
{
items: InventoryTile[],
- docType: string,
- openDoc(props: {name: string, type: string}): void,
- tab?: any,
- setTab?: any,
- level?: LevelInfo|InventoryOverview,
- enableAll?: boolean,
+ tab?: string,
+ setTab?: React.Dispatch>
}) {
- // TODO: `level` is only used in the `useEffect` below to check if a new level has
- // been loaded. Is there a better way to observe this?
- const gameId = React.useContext(GameIdContext)
+ const { gameId, worldId, levelId } = React.useContext(GameIdContext)
+ const { setDocTile, categoryTab, setCategoryTab } = useContext(InventoryContext)
const difficulty = useSelector(selectDifficulty(gameId))
- const categorySet = new Set()
- for (let item of items) {
- categorySet.add(item.category)
- }
- const categories = Array.from(categorySet).sort()
+ const inventory: string[] = selectInventory(gameId)(store.getState())
- // Add inventory items from local store as unlocked.
- // Items are unlocked if they are in the local store, or if the server says they should be
- // given the dependency graph. (OR-connection) (TODO: maybe add different logic for different
- // modi)
- let inv: string[] = selectInventory(gameId)(store.getState())
- let modifiedItems : InventoryTile[] = items.map(tile => inv.includes(tile.name) ? {...tile, locked: false} : tile)
+ const [categories, setCategories] = useState>([])
+ const [modifiedItems, setModifiedItems] = useState>([])
+ const [currentWorldItems, setCurrentWorldItems] = useState>([])
+
+
+ useEffect(() => {
+ const categorySet = new Set()
+
+ if (!items) {return}
+ for (let item of items) {
+ categorySet.add(item.category)
+ }
+ setCategories(Array.from(categorySet).sort())
+
+ // Add inventory items from local store as unlocked.
+ // Items are unlocked if they are in the local store, or if the server says they should be
+ // given the dependency graph. (OR-connection) (TODO: maybe add different logic for different
+ // modi)
+ let _modifiedItems : InventoryTile[] = items?.map(tile => inventory.includes(tile.name) ? {...tile, locked: false} : tile)
+ setModifiedItems(_modifiedItems)
+ // Item(s) proved in the preceeding level
+ setCurrentWorldItems(_modifiedItems.filter(x => x.world == worldId && x.level < levelId))
+ // setRecentItems(_modifiedItems.filter(x => x.world == worldId && x.level == levelId - 1))
+
+ }, []) // TODO: had `items, inventory`
return <>
- {categories.length > 1 &&
+ { categories.length > 1 &&
- {categories.map((cat) =>
-
{ setTab(cat) }}>{cat}
)}
+ {categories.map((cat) => {
+ let hasNew = modifiedItems.filter(item => item.new && (cat == item.category)).length > 0
+ return
x.category).includes(cat) ? ' recent': ''}`}
+ onClick={() => { setTab(cat) }}>{cat}
})}
}
{[...modifiedItems].sort(
- // For lemas, sort entries `available > disabled > locked`
- // otherwise alphabetically
- (x, y) => +(docType == "Lemma") * (+x.locked - +y.locked || +x.disabled - +y.disabled) || x.displayName.localeCompare(y.displayName)
+ // alternative approach:
+ // // For theorems, sort entries `available > disabled > locked`
+ // // otherwise alphabetically
+ // (x, y) => +(categoryTab == "theorem") * (+x.locked - +y.locked || +x.disabled - +y.disabled) || x.displayName.localeCompare(y.displayName)
+
+ // sort alphabetically
+ (x, y) => x.displayName.localeCompare(y.displayName)
).filter(item => !item.hidden && ((tab ?? categories[0]) == item.category)).map((item, i) => {
return {openDoc({name: item.name, type: docType})}}
+ showDoc={() => {setDocTile(item)}}
name={item.name} displayName={item.displayName} locked={difficulty > 0 ? item.locked : false}
- disabled={item.disabled} newly={item.new} enableAll={enableAll} />
+ disabled={item.disabled}
+ newly={item.new} />
})
}
>
}
-function InventoryItem({item, name, displayName, locked, disabled, newly, showDoc, enableAll=false}) {
- const icon = locked ? :
- disabled ? : item.st
- const className = locked ? "locked" : disabled ? "disabled" : newly ? "new" : ""
- // Note: This is somewhat a hack as the statement of lemmas comes currently in the form
- // `Namespace.statement_name (x y : Nat) : some type`
- const title = locked ? t("Not unlocked yet") :
- disabled ? t("Not available in this level") : (item.altTitle ? item.altTitle.substring(item.altTitle.indexOf(' ') + 1) : '')
- const [copied, setCopied] = useState(false)
- const handleClick = () => {
- if (enableAll || !locked) {
- showDoc()
- }
- }
+/** The `Inventory` shows all items present in the game sorted by item type. */
+export function Inventory () {
+ const { t } = useTranslation()
- const copyItemName = (ev) => {
- navigator.clipboard.writeText(displayName)
- setCopied(true)
- setInterval(() => {
- setCopied(false)
- }, 3000);
- ev.stopPropagation()
+ const { gameId, worldId, levelId } = React.useContext(GameIdContext)
+ const levelInfo = useLoadLevelQuery({game: gameId, world: worldId, level: levelId})
+
+ let { theoremTab, setTheoremTab, categoryTab, setCategoryTab } = useContext(InventoryContext)
+
+ /** Helper function to find if a list of tiles comprises any new elements. */
+ function containsNew(tiles: InventoryTile[]) {
+ return tiles?.filter(item => item.new).length > 0
}
-return
- {icon} {displayName}
-
- {copied ?
:
}
+ return (
+
+ { levelInfo.data ? <>
+
+
{ setCategoryTab("theorem") }}>{t("Theorems")}
+
{ setCategoryTab("tactic") }}>{t("Tactics")}
+
{ setCategoryTab("definition") }}>{t("Definitions")}
+
+ { (categoryTab == "theorem") &&
+
+ }
+ { (categoryTab == "tactic") &&
+
+ }
+ { (categoryTab == "definition") &&
+
+ }
+ > :
}
-
+ )
}
-export function Documentation({name, type, handleClose}) {
- const gameId = React.useContext(GameIdContext)
- const doc = useLoadDocQuery({game: gameId, type: type, name: name})
+/** The `documentation` */
+export function Documentation() {
+ const dispatch = useAppDispatch()
+ const { gameId } = useContext(GameIdContext)
+ const difficulty = useSelector(selectDifficulty(gameId))
+
+ // const docEntry = useLoadDocQuery({game: gameId, type: type, name: name})
+ let { docTile, setDocTile } = useContext(InventoryContext)
+
+ const docEntry = useLoadDocQuery({game: gameId, name: docTile.name})
+ let inv: string[] = selectInventory(gameId)(store.getState())
+
+ // Set `inventoryDoc` to `null` to close the doc
+ function closeInventoryDoc() { setDocTile(null) }
return
-
-
{doc.data?.displayName}
-
{doc.data?.statement}
- {/*
docstring: {doc.data?.docstring} */}
-
{t(doc.data?.content, {ns: gameId})}
+
+ { difficulty == 1 && docTile.locked &&
+
{
+ console.log(`Adding '${docTile.name}' to the inventory.`)
+ dispatch(changedInventory({ game: gameId, inventory: [...inv, docTile.name] }))
+ closeInventoryDoc() // note: closing seems better than keeping it open without the lock disappearing
+ }}
+ className="lock"
+ inverted={true} />
+ }
+ {docTile.displayName}
+ {docEntry.data?.statement}
+ {t(docEntry.data?.content, {ns: gameId})}
+ {/* TODO: The condition below should be updated so that the section
+ is displayed whenever it's non-empty. */}
+ {docTile.proven && <>
+ Further details
+
+ >
+ }
+
}
-/** The panel (on the welcome page) showing the user's inventory with tactics, definitions, and lemmas */
-export function InventoryPanel({levelInfo, visible = true}) {
- const gameId = React.useContext(GameIdContext)
-
- const [lemmaTab, setLemmaTab] = useState(levelInfo?.lemmaTab)
+/** The panel showing the user's inventory with tactics, definitions, and theorems */
+export function InventoryPanel({visible = true}) {
+ const {gameId, worldId, levelId} = React.useContext(GameIdContext)
+ const levelInfo = useLoadLevelQuery({game: gameId, world: worldId, level: levelId})
+ const inventory = useLoadInventoryOverviewQuery({game: gameId})
+ const [theoremTab, setTheoremTab] = useState
(null)
+ const [categoryTab, setCategoryTab] = useState<"tactic"|"theorem"|"definition">('tactic')
// The inventory is overlayed by the doc entry of a clicked item
- const [inventoryDoc, setInventoryDoc] = useState<{name: string, type: string}>(null)
- // Set `inventoryDoc` to `null` to close the doc
- function closeInventoryDoc() {setInventoryDoc(null)}
+ const [docTile, setDocTile] = useState(null)
- useEffect(() => {
- // If the level specifies `LemmaTab "Nat"`, we switch to this tab on loading.
+ useEffect(() => {
+ // If the level specifies `TheoremTab "Nat"`, we switch to this tab on loading.
// `defaultTab` is `null` or `undefined` otherwise, in which case we don't want to switch.
- if (levelInfo?.lemmaTab) {
- setLemmaTab(levelInfo?.lemmaTab)
+ if (levelInfo?.data?.theoremTab) {
+ setTheoremTab(levelInfo?.data?.theoremTab)
}}, [levelInfo])
return
- {inventoryDoc ?
-
+
+ {docTile ?
+
:
-
+
}
+
}
+
+// HERE: next up: locked items should not be disabled!
diff --git a/client/src/components/landing_page.tsx b/client/src/components/landing_page.tsx
index 3d4a0c99..0e7807b8 100644
--- a/client/src/components/landing_page.tsx
+++ b/client/src/components/landing_page.tsx
@@ -10,27 +10,16 @@ import '@fontsource/roboto/700.css';
import '../css/landing_page.css'
import bgImage from '../assets/bg.jpg'
-import Markdown from './markdown';
-import {PrivacyPolicyPopup} from './popup/privacy_policy'
-import { GameTile, useGetGameInfoQuery } from '../state/api'
+import { GameTile } from '../state/api'
import path from 'path';
-import { PreferencesPopup } from './popup/preferences';
-import { ImpressumButton, MenuButton, PreferencesButton } from './app_bar';
-import ReactCountryFlag from 'react-country-flag';
+// import ReactCountryFlag from 'react-country-flag';
import lean4gameConfig from '../config.json'
import i18next from 'i18next';
-
-function GithubIcon({url='https://github.com'}) {
-
- return
-}
+import { useContext } from 'react';
+import { PopupContext } from './popup/popup';
+import { Flag } from './flag';
+import { Markdown } from './utils';
function Tile({gameId, data}: {gameId: string, data: GameTile|undefined}) {
let { t } = useTranslation()
@@ -65,15 +54,13 @@ function Tile({gameId, data}: {gameId: string, data: GameTile|undefined}) {
{t("Levels")}
{data.levels}
-
+
{t("Language")}
- {data.languages.map((lang) => {
- let langOpt = lean4gameConfig.languages.find((e) => e.iso == lang)
- return
-
- })}
+ {data.languages.map((lang) => (
+
+ ))}
@@ -85,40 +72,62 @@ function Tile({gameId, data}: {gameId: string, data: GameTile|undefined}) {
function LandingPage() {
const navigate = useNavigate();
-
- const [impressumPopup, setImpressumPopup] = React.useState(false);
- const [preferencesPopup, setPreferencesPopup] = React.useState(false);
- const [navOpen, setNavOpen] = React.useState(false);
- const openImpressum = () => setImpressumPopup(true);
- const closeImpressum = () => setImpressumPopup(false);
- const toggleImpressum = () => setImpressumPopup(!impressumPopup);
- const closePreferencesPopup = () => setPreferencesPopup(false);
- const togglePreferencesPopup = () => setPreferencesPopup(!preferencesPopup);
+ const { setPopupContent } = useContext(PopupContext)
const [usageCPU, setUsageCPU] = React.useState()
const [usageMem, setUsageMem] = React.useState()
+ const [gameTiles, setGameTiles] = React.useState>([])
- const { t, i18n } = useTranslation()
+ const { t } = useTranslation()
// Load the namespaces of all games
// TODO: should `allGames` contain game-ids starting with `g/`?
i18next.loadNamespaces(lean4gameConfig.allGames.map(id => `g/${id}`))
- let allTiles = lean4gameConfig.allGames.map((gameId) => {
- let q = useGetGameInfoQuery({game: `g/${gameId}`})
+ const devMode = process.env.NODE_ENV == "development"
- // if (q.isError) {
- // if (q.error?.originalStatus === 404) {
- // // Handle 404 error
- // console.log('File not found');
- // } else {
- // // Suppress additional console.error messages
- // console.error(q.error);
- // }
- // }
-
- return q.data?.tile
- })
+ /**
+ *
+ */
+ React.useEffect(() => {
+ let games = [...lean4gameConfig.allGames]
+ const fetchGameInfos = async () => {
+ try {
+ if (devMode) {
+ await fetch(`${window.location.origin}/data/local_games`)
+ .then(response => {if (response.ok) {return response.json()} else {throw ""}})
+ .then((localGames: string[]) => {
+ games = games.concat(localGames.map((game: string) => (`local/${game}`)))
+ games.push("test/Test")
+ })
+ }
+ const promises = games.map(async game => {
+ try {
+ const response = await fetch(`${window.location.origin}/data/g/${game}/Game.json`)
+ if (!response.ok) {return null}
+ let gameInfo = await response.json()
+ return [game, gameInfo.tile]
+ } catch (err) {
+ console.info(`game ${game} unavailable`)
+ console.debug(err)
+ return null
+ }
+ })
+ let response = await Promise.all(promises)
+ response = response.filter(tile => tile !== null)
+ let tiles = response.map(([id, tile]) => {
+ return })
+ setGameTiles(tiles)
+ } catch (error) {
+ console.error("Error fetching data:", error)
+ }
+ }
+ fetchGameInfos()
+ }, [])
/** Parse `games/stats.csv` if present and display server capacity. */
React.useEffect(() => {
@@ -130,14 +139,6 @@ function LandingPage() {
return
-
- {allTiles.filter(x => x != null).length == 0 ?
-
-
- No Games loaded. Use http://localhost:3000/#/g/local/FOLDER to open a
- game directly from a local folder.
-
-
- : lean4gameConfig.allGames.map((id, i) => (
-
- ))
- }
-
+
+
+ { gameTiles }
+
+
{ // show server capacity from `games/stats.csv` if present
(usageMem >= 0 || usageCPU >= 0 ) &&
@@ -233,9 +222,8 @@ function LandingPage() {
diff --git a/client/src/components/level.tsx b/client/src/components/level.tsx
index 8d06b9e7..d71f53d1 100644
--- a/client/src/components/level.tsx
+++ b/client/src/components/level.tsx
@@ -2,523 +2,416 @@ import * as React from 'react'
import { useEffect, useState, useRef, useContext } from 'react'
import { useSelector, useStore } from 'react-redux'
import Split from 'react-split'
-import { useParams } from 'react-router-dom'
+import { useNavigate } from 'react-router-dom'
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
-import { faHome, faArrowRight } from '@fortawesome/free-solid-svg-icons'
+import { faHome, faArrowRight, faCode, faTerminal } from '@fortawesome/free-solid-svg-icons'
import { CircularProgress } from '@mui/material'
import type { Location } from 'vscode-languageserver-protocol'
-import * as monaco from 'monaco-editor/esm/vs/editor/editor.api.js'
-import { AbbreviationProvider } from 'lean4web/client/src/editor/abbreviation/AbbreviationProvider'
-import { AbbreviationRewriter } from 'lean4web/client/src/editor/abbreviation/rewriter/AbbreviationRewriter'
-import { InfoProvider } from 'lean4web/client/src/editor/infoview'
-import { LeanTaskGutter } from 'lean4web/client/src/editor/taskgutter'
-import { InfoviewApi } from '@leanprover/infoview'
-import { EditorContext } from '../../../node_modules/lean4-infoview/src/infoview/contexts'
-import { EditorConnection, EditorEvents } from '../../../node_modules/lean4-infoview/src/infoview/editorConnection'
-import { EventEmitter } from '../../../node_modules/lean4-infoview/src/infoview/event'
-import { Diagnostic } from 'vscode-languageserver-types'
-
-import { GameIdContext } from '../app'
+import * as monaco from 'monaco-editor'
+// import * as monaco from 'monaco-editor/esm/vs/editor/editor.api.js'
+// import { AbbreviationProvider } from 'lean4web/client/src/editor/abbreviation/AbbreviationProvider'
+// import { AbbreviationRewriter } from 'lean4web/client/src/editor/abbreviation/rewriter/AbbreviationRewriter'
+// import { InfoProvider } from 'lean4web/client/src/editor/infoview'
+// import { LeanTaskGutter } from 'lean4web/client/src/editor/taskgutter'
+// import { InfoviewApi } from '@leanprover/infoview'
+// import { EditorContext } from '../../../node_modules/lean4-infoview/src/infoview/contexts'
+// import { EditorConnection, EditorEvents } from '../../../node_modules/lean4-infoview/src/infoview/editorConnection'
+// import { EventEmitter } from '../../../node_modules/lean4-infoview/src/infoview/event'
+// import { Diagnostic } from 'vscode-languageserver-types'
+// import { DiagnosticSeverity } from 'vscode-languageclient';
+
import { useAppDispatch, useAppSelector } from '../hooks'
import { useGetGameInfoQuery, useLoadInventoryOverviewQuery, useLoadLevelQuery } from '../state/api'
import { changedSelection, codeEdited, selectCode, selectSelections, selectCompleted, helpEdited,
selectHelp, selectDifficulty, selectInventory, selectTypewriterMode, changeTypewriterMode } from '../state/progress'
import { store } from '../state/store'
-import { Button } from './button'
-import Markdown from './markdown'
import {InventoryPanel} from './inventory'
-import { hasInteractiveErrors } from './infoview/typewriter'
-import { DeletedChatContext, InputModeContext, PreferencesContext, MonacoEditorContext,
- ProofContext, SelectionContext, WorldLevelIdContext } from './infoview/context'
-import { DualEditor } from './infoview/main'
-import { GameHint, InteractiveGoalsWithHints, ProofState } from './infoview/rpc_api'
-import { DeletedHints, Hint, Hints, MoreHelpButton, filterHints } from './hints'
-import { PrivacyPolicyPopup } from './popup/privacy_policy'
+import { ChatContext, InputModeContext, PreferencesContext, MonacoEditorContext,
+ ProofContext, PageContext, GameIdContext } from '../state/context'
+// import { DualEditor, ExerciseStatement } from './infoview/main'
+// import { GameHint, InteractiveGoalsWithHints, ProofState } from './infoview/rpc_api'
+
import path from 'path';
import '@fontsource/roboto/300.css'
import '@fontsource/roboto/400.css'
import '@fontsource/roboto/500.css'
import '@fontsource/roboto/700.css'
-import 'lean4web/client/src/editor/infoview.css'
-import 'lean4web/client/src/editor/vscode.css'
+// import 'lean4web/client/src/editor/infoview.css'
+// import 'lean4web/client/src/editor/vscode.css'
import '../css/level.css'
-import { LevelAppBar } from './app_bar'
-import { LeanClient } from 'lean4web/client/src/editor/leanclient'
-import { DisposingWebSocketMessageReader } from 'lean4web/client/src/reader'
-import { WebSocketMessageWriter, toSocket } from 'vscode-ws-jsonrpc'
-import { IConnectionProvider } from 'monaco-languageclient'
-import { monacoSetup } from 'lean4web/client/src/monacoSetup'
-import { onigasmH } from 'onigasm/lib/onigasmH'
-import { isLastStepWithErrors, lastStepHasErrors } from './infoview/goals'
-import { InfoPopup } from './popup/game_info'
+// import { LeanClient } from 'lean4web/client/src/editor/leanclient'
+// import { DisposingWebSocketMessageReader } from 'lean4web/client/src/reader'
+// import { WebSocketMessageWriter, toSocket } from 'vscode-ws-jsonrpc'
+// import { IConnectionProvider } from 'monaco-languageclient'
+// import { monacoSetup } from 'lean4web/client/src/monacoSetup'
+// import { onigasmH } from 'onigasm/lib/onigasmH'
+// import { isLastStepWithErrors, lastStepHasErrors } from './infoview/goals'
+import { InfoPopup } from './popup/info'
import { PreferencesPopup } from './popup/preferences'
import { useTranslation } from 'react-i18next'
import i18next from 'i18next'
+import { ChatButtons } from './chat'
+import { NavButton } from './navigation'
+import { ExerciseStatement } from './editor/ExcerciseStatement'
+import { Editor } from './editor/Editor'
+
+export function NewLevel({visible = true}) {
+ const dispatch = useAppDispatch()
+ let { t } = useTranslation()
+ const {gameId, worldId, levelId} = React.useContext(GameIdContext)
+ const { mobile } = useContext(PreferencesContext)
-monacoSetup()
+ const [lockEditorMode, setLockEditorMode] = useState(false)
+
+ const gameInfo = useGetGameInfoQuery({game: gameId})
+ const levelInfo = useLoadLevelQuery({game: gameId, world: worldId, level: levelId})
+ const typewriterMode = useSelector(selectTypewriterMode(gameId))
-function Level() {
- const params = useParams()
- const levelId = parseInt(params.levelId)
- const worldId = params.worldId
+ const proofPanelRef = React.useRef(null)
- const gameId = React.useContext(GameIdContext)
+ const setTypewriterMode = (newTypewriterMode: boolean) => dispatch(changeTypewriterMode({
+ game: gameId,
+ typewriterMode: newTypewriterMode
+ }))
// Load the namespace of the game
i18next.loadNamespaces(gameId).catch(err => {
console.warn(`translations for ${gameId} do not exist.`)
})
- const gameInfo = useGetGameInfoQuery({game: gameId})
-
- // pop-ups
- const [impressum, setImpressum] = React.useState(false)
- const [info, setInfo] = React.useState(false)
- const [preferencesPopup, setPreferencesPopup] = React.useState(false)
-
- function closeImpressum() {setImpressum(false)}
- function closeInfo() {setInfo(false)}
- function closePreferencesPopup() {setPreferencesPopup(false)}
- function toggleImpressum() {setImpressum(!impressum)}
- function toggleInfo() {setInfo(!info)}
- function togglePreferencesPopup() {setPreferencesPopup(!preferencesPopup)}
-
- return
- {levelId == 0 ?
- :
- }
- {impressum ? : null}
- {info ? : null}
- {preferencesPopup ? : null}
-
-}
-
-function ChatPanel({lastLevel, visible = true}) {
- let { t } = useTranslation()
- const chatRef = useRef(null)
- const {mobile} = useContext(PreferencesContext)
- const gameId = useContext(GameIdContext)
- const {worldId, levelId} = useContext(WorldLevelIdContext)
- const level = useLoadLevelQuery({game: gameId, world: worldId, level: levelId})
- const {proof, setProof} = useContext(ProofContext)
- const {deletedChat, setDeletedChat, showHelp, setShowHelp} = useContext(DeletedChatContext)
- const {selectedStep, setSelectedStep} = useContext(SelectionContext)
- const completed = useAppSelector(selectCompleted(gameId, worldId, levelId))
-
- let k = proof?.steps.length ? proof?.steps.length - (lastStepHasErrors(proof) ? 2 : 1) : 0
-
- function toggleSelection(line: number) {
- return (ev) => {
- console.debug('toggled selection')
- if (selectedStep == line) {
- setSelectedStep(undefined)
- } else {
- setSelectedStep(line)
- }
+ /** toggle input mode if allowed */
+ function toggleInputMode(ev: React.MouseEvent) {
+ if (!lockEditorMode) {
+ setTypewriterMode(!typewriterMode)
+ console.log('test')
}
}
- useEffect(() => {
- // TODO: For some reason this is always called twice
- console.debug('scroll chat')
- if (!mobile) {
- chatRef.current!.lastElementChild?.scrollIntoView() //scrollTo(0,0)
+ return
+ { // Display world image if it exists.
+ gameInfo.data?.worlds.nodes[worldId].image &&
+
+
+
}
- }, [proof, showHelp])
-
- // Scroll to element if selection changes
- useEffect(() => {
- if (typeof selectedStep !== 'undefined') {
- Array.from(chatRef.current?.getElementsByClassName(`step-${selectedStep}`)).map((elem) => {
- elem.scrollIntoView({block: "center"})
- })
+ { levelId > 0 &&
+
+
toggleInputMode(ev)}
+ title={lockEditorMode ? t("Editor mode is enforced!") : typewriterMode ? t("Editor mode") : t("Typewriter mode")} />
+
+
+
+
+ {/*
*/}
+ {/*
*/}
+ {/*
*/}
+ {/* { typewriterMode ?
:
} */}
+
+
}
- }, [selectedStep])
-
- // useEffect(() => {
- // // // Scroll to top when loading a new level
- // // // TODO: Thats the wrong behaviour probably
- // // chatRef.current!.scrollTo(0,0)
- // }, [gameId, worldId, levelId])
-
- let introText: Array
= t(level?.data?.introduction, {ns: gameId}).split(/\n(\s*\n)+/)
-
- return
-
- {introText?.filter(t => t.trim()).map(((t, i) =>
- // Show the level's intro text as hints, too
-
- ))}
- {proof?.steps.map((step, i) => {
- let filteredHints = filterHints(step.goals[0]?.hints, proof?.steps[i-1]?.goals[0]?.hints)
- if (step.goals.length > 0 && !isLastStepWithErrors(proof, i)) {
- return
- }
- })}
-
- {/* {modifiedHints.map((step, i) => {
- // It the last step has errors, it will have the same hints
- // as the second-to-last step. Therefore we should not display them.
- if (!(i == proof?.steps.length - 1 && withErr)) {
- // TODO: Should not use index as key.
- return
- }
- })} */}
-
- {proof?.completed &&
- <>
-
- {t("Level completed! 🎉")}
-
- {level?.data?.conclusion?.trim() &&
-
- {t(level?.data?.conclusion, {ns: gameId})}
-
- }
- >
- }
-
-
- {proof?.completed && (lastLevel ?
-
- {t("Leave World")}
- :
-
- {t("Next")}
- )
- }
-
-
}
-function ExercisePanel({codeviewRef, visible=true}: {codeviewRef: React.MutableRefObject, visible?: boolean}) {
- const gameId = React.useContext(GameIdContext)
- const {worldId, levelId} = useContext(WorldLevelIdContext)
- const level = useLoadLevelQuery({game: gameId, world: worldId, level: levelId})
- const gameInfo = useGetGameInfoQuery({game: gameId})
- return
-}
-
-function PlayableLevel({impressum, setImpressum, toggleInfo, togglePreferencesPopup}) {
- let { t } = useTranslation()
- const codeviewRef = useRef(null)
- const gameId = React.useContext(GameIdContext)
- const {worldId, levelId} = useContext(WorldLevelIdContext)
- const {mobile} = React.useContext(PreferencesContext)
- const dispatch = useAppDispatch()
- const initialCode = useAppSelector(selectCode(gameId, worldId, levelId))
- const initialSelections = useAppSelector(selectSelections(gameId, worldId, levelId))
+// monacoSetup()
- const typewriterMode = useSelector(selectTypewriterMode(gameId))
- const setTypewriterMode = (newTypewriterMode: boolean) => dispatch(changeTypewriterMode({game: gameId, typewriterMode: newTypewriterMode}))
+// export function Level({visible = true}) {
+// let { t } = useTranslation()
- const gameInfo = useGetGameInfoQuery({game: gameId})
- const level = useLoadLevelQuery({game: gameId, world: worldId, level: levelId})
- // The state variables for the `ProofContext`
- const [proof, setProof] = useState({steps: [], diagnostics: [], completed: false, completedWithWarnings: false})
- const [interimDiags, setInterimDiags] = useState>([])
- const [isCrashed, setIsCrashed] = useState(false)
+// const {gameId, worldId, levelId} = React.useContext(GameIdContext)
+// // Load the namespace of the game
+// i18next.loadNamespaces(gameId).catch(err => {
+// console.warn(`translations for ${gameId} do not exist.`)
+// })
- // When deleting the proof, we want to keep to old messages around until
- // a new proof has been entered. e.g. to consult messages coming from dead ends
- const [deletedChat, setDeletedChat] = useState>([])
- // A set of row numbers where help is displayed
- const [showHelp, setShowHelp] = useState>(new Set())
- // Only for mobile layout
- const [pageNumber, setPageNumber] = useState(0)
+// const gameInfo = useGetGameInfoQuery({game: gameId})
+// const levelInfo = useLoadLevelQuery({game: gameId, world: worldId, level: levelId})
- // set to true to prevent switching between typewriter and editor
- const [lockEditorMode, setLockEditorMode] = useState(false)
- const [typewriterInput, setTypewriterInput] = useState("")
- const lastLevel = levelId >= gameInfo.data?.worldSize[worldId]
+// const codeviewRef = useRef(null)
- // impressum pop-up
- function toggleImpressum() {setImpressum(!impressum)}
+// const dispatch = useAppDispatch()
+
+// const initialCode = useAppSelector(selectCode(gameId, worldId, levelId))
+// const initialSelections = useAppSelector(selectSelections(gameId, worldId, levelId))
+
+// const typewriterMode = useSelector(selectTypewriterMode(gameId))
+// const setTypewriterMode = (newTypewriterMode: boolean) => dispatch(changeTypewriterMode({game: gameId, typewriterMode: newTypewriterMode}))
+
+// const {deletedChat, setDeletedChat,showHelp, setShowHelp} = useContext(ChatContext)
+// const {proof, setProof} = useContext(ProofContext)
+
+// // Only for mobile layout
+// const {page, setPage} = useContext(PageContext)
+
+// // set to true to prevent switching between typewriter and editor
+// const [lockEditorMode, setLockEditorMode] = useState(false)
+// const [typewriterInput, setTypewriterInput] = useState("")
+// const lastLevel = levelId >= gameInfo.data?.worldSize[worldId]
+
+// // // impressum pop-up
+// // function toggleImpressum() {setImpressum(!impressum)}
+// // function togglePrivacy() {setPrivacy(!privacy)}
+
+// // When clicking on an inventory item, the inventory is overlayed by the item's doc.
+// // If this state is set to a pair `(name, type)` then the according doc will be open.
+// // Set `inventoryDoc` to `null` to close the doc
+// const [inventoryDoc, setInventoryDoc] = useState<{name: string, type: string}>(null)
+// function closeInventoryDoc () {setInventoryDoc(null)}
+
+// const onDidChangeContent = (code) => {
+// dispatch(codeEdited({game: gameId, world: worldId, level: levelId, code}))
+// }
+
+// const onDidChangeSelection = (monacoSelections) => {
+// const selections = monacoSelections.map(
+// ({selectionStartLineNumber, selectionStartColumn, positionLineNumber, positionColumn}) =>
+// {return {selectionStartLineNumber, selectionStartColumn, positionLineNumber, positionColumn}})
+// dispatch(changedSelection({game: gameId, world: worldId, level: levelId, selections}))
+// }
+
+
+// // const {editor, infoProvider, editorConnection} =
+// // useLevelEditor(codeviewRef, initialCode, initialSelections, onDidChangeContent, onDidChangeSelection)
+
+// // /** Unused. Was implementing an undo button, which has been replaced by `deleteProof` inside
+// // * `TypewriterInterface`.
+// // */
+// // const handleUndo = () => {
+// // const endPos = editor.getModel().getFullModelRange().getEndPosition()
+// // let range
+// // console.log(endPos.column)
+// // if (endPos.column === 1) {
+// // range = monaco.Selection.fromPositions(
+// // new monaco.Position(endPos.lineNumber - 1, 1),
+// // endPos
+// // )
+// // } else {
+// // range = monaco.Selection.fromPositions(
+// // new monaco.Position(endPos.lineNumber, 1),
+// // endPos
+// // )
+// // }
+// // editor.executeEdits("undo-button", [{
+// // range,
+// // text: "",
+// // forceMoveMarkers: false
+// // }]);
+// // }
+
+// // Select and highlight proof steps and corresponding hints
+// // TODO: with the new design, there is no difference between the introduction and
+// // a hint at the beginning of the proof...
+// const [selectedStep, setSelectedStep] = useState()
+
+
+// // useEffect (() => {
+// // // Lock editor mode
+// // if (levelInfo.data?.template) {
+// // setLockEditorMode(true)
+
+// // if (editor) {
+// // let code = editor.getModel().getLinesContent()
+
+// // // console.log(`insert. code: ${code}`)
+// // // console.log(`insert. join: ${code.join('')}`)
+// // // console.log(`insert. trim: ${code.join('').trim()}`)
+// // // console.log(`insert. length: ${code.join('').trim().length}`)
+// // // console.log(`insert. range: ${editor.getModel().getFullModelRange()}`)
+
+
+// // // TODO: It does seem that the template is always indented by spaces.
+// // // This is a hack, assuming there are exactly two.
+// // if (!code.join('').trim().length) {
+// // console.debug(`inserting template:\n${levelInfo.data.template}`)
+// // // TODO: This does not work! HERE
+// // // Probably overwritten by a query to the server
+// // editor.executeEdits("template-writer", [{
+// // range: editor.getModel().getFullModelRange(),
+// // text: levelInfo.data.template + `\n`,
+// // forceMoveMarkers: true
+// // }])
+// // } else {
+// // console.debug(`not inserting template.`)
+// // }
+// // }
+// // } else {
+// // setLockEditorMode(false)
+// // }
+// // }, [levelInfo, levelId, worldId, gameId, editor])
+
+
+// // useEffect(() => {
+// // // TODO: That's a problem if the saved proof contains an error
+// // // Reset command line input when loading a new level
+// // setTypewriterInput("")
+
+// // // Load the selected help steps from the store
+// // setShowHelp(new Set(selectHelp(gameId, worldId, levelId)(store.getState())))
+// // }, [gameId, worldId, levelId])
+
+// // useEffect(() => {
+// // if (!(typewriterMode && !lockEditorMode) && editor) {
+// // // Delete last input attempt from command line
+// // editor.executeEdits("typewriter", [{
+// // range: editor.getSelection(),
+// // text: "",
+// // forceMoveMarkers: false
+// // }]);
+// // editor.focus()
+// // }
+// // }, [typewriterMode, lockEditorMode])
+
+// useEffect(() => {
+// // Forget whether hidden hints are displayed for steps that don't exist yet
+// if (proof?.steps.length) {
+// console.debug(Array.from(showHelp))
+// setShowHelp(new Set(Array.from(showHelp).filter(i => (i < proof?.steps.length))))
+// }
+// }, [proof])
+
+// // save showed help in store
+// useEffect(() => {
+// if (proof?.steps.length) {
+// console.debug(`showHelp:\n ${showHelp}`)
+// dispatch(helpEdited({game: gameId, world: worldId, level: levelId, help: Array.from(showHelp)}))
+// }
+// }, [showHelp])
+
+// // Effect when command line mode gets enabled
+// // useEffect(() => {
+// // if (//onigasmH &&
+// // editor && (typewriterMode && !lockEditorMode)) {
+// // let code = editor.getModel().getLinesContent().filter(line => line.trim())
+// // editor.executeEdits("typewriter", [{
+// // range: editor.getModel().getFullModelRange(),
+// // text: code.length ? code.join('\n') + '\n' : '',
+// // forceMoveMarkers: true
+// // }]);
+
+// // let endPos = editor.getModel().getFullModelRange().getEndPosition()
+// // if (editor.getModel().getLineContent(endPos.lineNumber).trim() !== "") {
+// // editor.executeEdits("typewriter", [{
+// // range: monaco.Selection.fromPositions(endPos, endPos),
+// // text: "\n",
+// // forceMoveMarkers: true
+// // }]);
+// // }
+// // let endPos = editor.getModel().getFullModelRange().getEndPosition()
+// // let currPos = editor.getPosition()
+// // if (currPos.column != 1 || (currPos.lineNumber != endPos.lineNumber && currPos.lineNumber != endPos.lineNumber - 1)) {
+// // // This is not a position that would naturally occur from Typewriter, reset:
+// // editor.setSelection(monaco.Selection.fromPositions(endPos, endPos))
+// // }
+// // }
+// // }, [editor, typewriterMode, lockEditorMode, ])//onigasmH == null])
+
+
+// return
+// {/*
*/}
+// {/*
+// */}
+// {levelId > 0 &&
+// }
+// {/*
+// */}
+//
+// }
- // When clicking on an inventory item, the inventory is overlayed by the item's doc.
- // If this state is set to a pair `(name, type)` then the according doc will be open.
- // Set `inventoryDoc` to `null` to close the doc
- const [inventoryDoc, setInventoryDoc] = useState<{name: string, type: string}>(null)
- function closeInventoryDoc () {setInventoryDoc(null)}
+//
+//
+//
- const onDidChangeContent = (code) => {
- dispatch(codeEdited({game: gameId, world: worldId, level: levelId, code}))
- }
- const onDidChangeSelection = (monacoSelections) => {
- const selections = monacoSelections.map(
- ({selectionStartLineNumber, selectionStartColumn, positionLineNumber, positionColumn}) =>
- {return {selectionStartLineNumber, selectionStartColumn, positionLineNumber, positionColumn}})
- dispatch(changedSelection({game: gameId, world: worldId, level: levelId, selections}))
- }
+// export function ExercisePanel({codeviewRef, visible=true}: {codeviewRef: React.MutableRefObject, visible?: boolean}) {
+// const {gameId, worldId, levelId} = React.useContext(GameIdContext)
+// const level = useLoadLevelQuery({game: gameId, world: worldId, level: levelId})
+// const gameInfo = useGetGameInfoQuery({game: gameId})
+// return
+// }
- const {editor, infoProvider, editorConnection} =
- useLevelEditor(codeviewRef, initialCode, initialSelections, onDidChangeContent, onDidChangeSelection)
-
- /** Unused. Was implementing an undo button, which has been replaced by `deleteProof` inside
- * `TypewriterInterface`.
- */
- const handleUndo = () => {
- const endPos = editor.getModel().getFullModelRange().getEndPosition()
- let range
- console.log(endPos.column)
- if (endPos.column === 1) {
- range = monaco.Selection.fromPositions(
- new monaco.Position(endPos.lineNumber - 1, 1),
- endPos
- )
- } else {
- range = monaco.Selection.fromPositions(
- new monaco.Position(endPos.lineNumber, 1),
- endPos
- )
- }
- editor.executeEdits("undo-button", [{
- range,
- text: "",
- forceMoveMarkers: false
- }]);
- }
+//
+//
+//
+//
- // Select and highlight proof steps and corresponding hints
- // TODO: with the new design, there is no difference between the introduction and
- // a hint at the beginning of the proof...
- const [selectedStep, setSelectedStep] = useState()
-
-
- useEffect (() => {
- // Lock editor mode
- if (level?.data?.template) {
- setLockEditorMode(true)
-
- if (editor) {
- let code = editor.getModel().getLinesContent()
-
- // console.log(`insert. code: ${code}`)
- // console.log(`insert. join: ${code.join('')}`)
- // console.log(`insert. trim: ${code.join('').trim()}`)
- // console.log(`insert. length: ${code.join('').trim().length}`)
- // console.log(`insert. range: ${editor.getModel().getFullModelRange()}`)
-
-
- // TODO: It does seem that the template is always indented by spaces.
- // This is a hack, assuming there are exactly two.
- if (!code.join('').trim().length) {
- console.debug(`inserting template:\n${level.data.template}`)
- // TODO: This does not work! HERE
- // Probably overwritten by a query to the server
- editor.executeEdits("template-writer", [{
- range: editor.getModel().getFullModelRange(),
- text: level.data.template + `\n`,
- forceMoveMarkers: true
- }])
- } else {
- console.debug(`not inserting template.`)
- }
- }
- } else {
- setLockEditorMode(false)
- }
- }, [level, levelId, worldId, gameId, editor])
-
-
- useEffect(() => {
- // TODO: That's a problem if the saved proof contains an error
- // Reset command line input when loading a new level
- setTypewriterInput("")
-
- // Load the selected help steps from the store
- setShowHelp(new Set(selectHelp(gameId, worldId, levelId)(store.getState())))
- }, [gameId, worldId, levelId])
-
- useEffect(() => {
- if (!(typewriterMode && !lockEditorMode) && editor) {
- // Delete last input attempt from command line
- editor.executeEdits("typewriter", [{
- range: editor.getSelection(),
- text: "",
- forceMoveMarkers: false
- }]);
- editor.focus()
- }
- }, [typewriterMode, lockEditorMode])
+// function IntroductionPanel({gameInfo}) {
+// let { t } = useTranslation()
+// const {gameId, worldId} = React.useContext(GameIdContext)
+// const {mobile} = React.useContext(PreferencesContext)
- useEffect(() => {
- // Forget whether hidden hints are displayed for steps that don't exist yet
- if (proof?.steps.length) {
- console.debug(Array.from(showHelp))
- setShowHelp(new Set(Array.from(showHelp).filter(i => (i < proof?.steps.length))))
- }
- }, [proof])
+// let text: Array = t(gameInfo.data?.worlds.nodes[worldId].introduction, {ns: gameId}).split(/\n(\s*\n)+/)
- // save showed help in store
- useEffect(() => {
- if (proof?.steps.length) {
- console.debug(`showHelp:\n ${showHelp}`)
- dispatch(helpEdited({game: gameId, world: worldId, level: levelId, help: Array.from(showHelp)}))
- }
- }, [showHelp])
-
- // Effect when command line mode gets enabled
- useEffect(() => {
- if (onigasmH && editor && (typewriterMode && !lockEditorMode)) {
- let code = editor.getModel().getLinesContent().filter(line => line.trim())
- editor.executeEdits("typewriter", [{
- range: editor.getModel().getFullModelRange(),
- text: code.length ? code.join('\n') + '\n' : '',
- forceMoveMarkers: true
- }]);
-
- // let endPos = editor.getModel().getFullModelRange().getEndPosition()
- // if (editor.getModel().getLineContent(endPos.lineNumber).trim() !== "") {
- // editor.executeEdits("typewriter", [{
- // range: monaco.Selection.fromPositions(endPos, endPos),
- // text: "\n",
- // forceMoveMarkers: true
- // }]);
- // }
- // let endPos = editor.getModel().getFullModelRange().getEndPosition()
- // let currPos = editor.getPosition()
- // if (currPos.column != 1 || (currPos.lineNumber != endPos.lineNumber && currPos.lineNumber != endPos.lineNumber - 1)) {
- // // This is not a position that would naturally occur from Typewriter, reset:
- // editor.setSelection(monaco.Selection.fromPositions(endPos, endPos))
- // }
- }
- }, [editor, typewriterMode, lockEditorMode, onigasmH == null])
-
- return <>
-
-
-
-
-
-
-
-
- {mobile?
- // TODO: This is copied from the `Split` component below...
- <>
-
-
-
-
- >
- :
-
-
-
-
-
- }
-
-
-
-
-
-
- >
-}
+// return
+//
+// {text?.filter(t => t.trim()).map(((t, i) =>
+//
+// ))}
+//
+//
+//
+// }
-function IntroductionPanel({gameInfo}) {
- let { t } = useTranslation()
- const gameId = React.useContext(GameIdContext)
- const {worldId} = useContext(WorldLevelIdContext)
- const {mobile} = React.useContext(PreferencesContext)
-
- let text: Array = t(gameInfo.data?.worlds.nodes[worldId].introduction, {ns: gameId}).split(/\n(\s*\n)+/)
-
- return
-
- {text?.filter(t => t.trim()).map(((t, i) =>
-
- ))}
-
-
- {gameInfo.data?.worldSize[worldId] == 0 ?
- :
-
- {t("Start")}
-
- }
-
-
-}
+// /** The site with the introduction text of a world */
+// function Introduction() {
+// let { t } = useTranslation()
-export default Level
+// const {gameId, worldId} = React.useContext(GameIdContext)
+// const {mobile} = useContext(PreferencesContext)
-/** The site with the introduction text of a world */
-function Introduction({impressum, setImpressum, toggleInfo, togglePreferencesPopup}) {
- let { t } = useTranslation()
+// const inventory = useLoadInventoryOverviewQuery({game: gameId})
- const gameId = React.useContext(GameIdContext)
- const {mobile} = useContext(PreferencesContext)
+// const gameInfo = useGetGameInfoQuery({game: gameId})
- const inventory = useLoadInventoryOverviewQuery({game: gameId})
- const gameInfo = useGetGameInfoQuery({game: gameId})
-
- const {worldId} = useContext(WorldLevelIdContext)
+// let image: string = gameInfo.data?.worlds.nodes[worldId].image
- let image: string = gameInfo.data?.worlds.nodes[worldId].image
+// // const toggleImpressum = () => {
+// // setImpressum(!impressum)
+// // }
+// // const togglePrivacy = () => {
+// // setPrivacy(!privacy)
+// // }
+// return <>
+// {/* */}
+// {gameInfo.isLoading ?
+//
+// : mobile ?
+//
+// :
+// //
+// //
+//
+// {image &&
+//
+// }
- const toggleImpressum = () => {
- setImpressum(!impressum)
- }
+//
+// // {/* */}
+// //
+// }
- return <>
-
- {gameInfo.isLoading ?
-
- : mobile ?
-
- :
-
-
-
- {image &&
-
- }
-
-
-
-
- }
-
- >
-}
+// >
+// }
// {mobile?
// // TODO: This is copied from the `Split` component below...
@@ -543,167 +436,170 @@ function Introduction({impressum, setImpressum, toggleInfo, togglePreferencesPop
//
// }
-function useLevelEditor(codeviewRef, initialCode, initialSelections, onDidChangeContent, onDidChangeSelection) {
-
- const gameId = React.useContext(GameIdContext)
- const {worldId, levelId} = useContext(WorldLevelIdContext)
-
- const [editor, setEditor] = useState(null)
- const [infoProvider, setInfoProvider] = useState(null)
- const [editorConnection, setEditorConnection] = useState(null)
-
- const uriStr = `file:///${worldId}/${levelId}`
- const uri = monaco.Uri.parse(uriStr)
-
- const inventory: Array = useSelector(selectInventory(gameId))
- const difficulty: number = useSelector(selectDifficulty(gameId))
-
- useEffect(() => {
- const model = monaco.editor.createModel(initialCode ?? '', 'lean4', uri)
- if (onDidChangeContent) {
- model.onDidChangeContent(() => onDidChangeContent(model.getValue()))
- }
-
- const editor = monaco.editor.create(codeviewRef.current!, {
- model,
- glyphMargin: true,
- quickSuggestions: false,
- lineDecorationsWidth: 5,
- folding: false,
- lineNumbers: 'on',
- lightbulb: {
- enabled: true
- },
- unicodeHighlight: {
- ambiguousCharacters: false,
- },
- automaticLayout: true,
- minimap: {
- enabled: false
- },
- lineNumbersMinChars: 3,
- tabSize: 2,
- 'semanticHighlighting.enabled': true,
- theme: 'vs-code-theme-converted'
- })
- if (onDidChangeSelection) {
- editor.onDidChangeCursorSelection(() => onDidChangeSelection(editor.getSelections()))
- }
- if (initialSelections) {
- console.debug("Initial Selection: ", initialSelections)
- // BUG: Somehow I get an `invalid arguments` bug here
- // editor.setSelections(initialSelections)
- }
- setEditor(editor)
- const abbrevRewriter = new AbbreviationRewriter(new AbbreviationProvider(), model, editor)
-
- const socketUrl = ((window.location.protocol === "https:") ? "wss://" : "ws://") + window.location.host + '/websocket/' + gameId
-
- const connectionProvider : IConnectionProvider = {
- get: async () => {
- return await new Promise((resolve, reject) => {
- console.log(`connecting ${socketUrl}`)
- const websocket = new WebSocket(socketUrl)
- websocket.addEventListener('error', (ev) => {
- reject(ev)
- })
- websocket.addEventListener('message', (msg) => {
- // console.log(msg.data)
- })
- websocket.addEventListener('open', () => {
- const socket = toSocket(websocket)
- const reader = new DisposingWebSocketMessageReader(socket)
- const writer = new WebSocketMessageWriter(socket)
- resolve({
- reader,
- writer
- })
- })
- })
- }
- }
-
- // Following `vscode-lean4/webview/index.ts`
- const client = new LeanClient(connectionProvider, showRestartMessage, {inventory, difficulty})
- const infoProvider = new InfoProvider(client)
- // const div: HTMLElement = infoviewRef.current!
- const imports = {
- '@leanprover/infoview': `${window.location.origin}/index.production.min.js`,
- 'react': `${window.location.origin}/react.production.min.js`,
- 'react/jsx-runtime': `${window.location.origin}/react-jsx-runtime.production.min.js`,
- 'react-dom': `${window.location.origin}/react-dom.production.min.js`,
- 'react-popper': `${window.location.origin}/react-popper.production.min.js`
- }
- // loadRenderInfoview(imports, [infoProvider.getApi(), div], setInfoviewApi)
- setInfoProvider(infoProvider)
-
- // TODO: it looks like we get errors "File Changed" here.
- client.restart("Lean4Game")
-
- const editorApi = infoProvider.getApi()
-
- const editorEvents: EditorEvents = {
- initialize: new EventEmitter(),
- gotServerNotification: new EventEmitter(),
- sentClientNotification: new EventEmitter(),
- serverRestarted: new EventEmitter(),
- serverStopped: new EventEmitter(),
- changedCursorLocation: new EventEmitter(),
- changedInfoviewConfig: new EventEmitter(),
- runTestScript: new EventEmitter(),
- requestedAction: new EventEmitter(),
- };
-
- // Challenge: write a type-correct fn from `Eventify` to `T` without using `any`
- const infoviewApi: InfoviewApi = {
- initialize: async l => editorEvents.initialize.fire(l),
- gotServerNotification: async (method, params) => {
- editorEvents.gotServerNotification.fire([method, params]);
- },
- sentClientNotification: async (method, params) => {
- editorEvents.sentClientNotification.fire([method, params]);
- },
- serverRestarted: async r => editorEvents.serverRestarted.fire(r),
- serverStopped: async serverStoppedReason => {
- editorEvents.serverStopped.fire(serverStoppedReason)
- },
- changedCursorLocation: async loc => editorEvents.changedCursorLocation.fire(loc),
- changedInfoviewConfig: async conf => editorEvents.changedInfoviewConfig.fire(conf),
- requestedAction: async action => editorEvents.requestedAction.fire(action),
- // See https://rollupjs.org/guide/en/#avoiding-eval
- // eslint-disable-next-line @typescript-eslint/no-implied-eval
- runTestScript: async script => new Function(script)(),
- getInfoviewHtml: async () => document.body.innerHTML,
- };
-
- const ec = new EditorConnection(editorApi, editorEvents);
- setEditorConnection(ec)
-
- editorEvents.initialize.on((loc: Location) => ec.events.changedCursorLocation.fire(loc))
-
- setEditor(editor)
- setInfoProvider(infoProvider)
-
- infoProvider.openPreview(editor, infoviewApi)
- const taskgutter = new LeanTaskGutter(infoProvider.client, editor)
-
- // TODO:
- // setRestart(() => restart)
-
- return () => {
- editor.dispose();
- model.dispose();
- abbrevRewriter.dispose();
- taskgutter.dispose();
- infoProvider.dispose();
- client.dispose();
- }
- }, [gameId, worldId, levelId])
-
- const showRestartMessage = () => {
- // setRestartMessage(true)
- console.log("TODO: SHOW RESTART MESSAGE")
- }
-
- return {editor, infoProvider, editorConnection}
-}
+// function useLevelEditor(codeviewRef, initialCode, initialSelections, onDidChangeContent, onDidChangeSelection) {
+
+// const {gameId, worldId, levelId} = React.useContext(GameIdContext)
+
+// const [editor, setEditor] = useState(null)
+// const [infoProvider, setInfoProvider] = useState(null)
+// const [editorConnection, setEditorConnection] = useState(null)
+
+// const uriStr = `file:///${worldId}/${levelId}`
+// const uri = monaco.Uri.parse(uriStr)
+
+// const inventory: Array = useSelector(selectInventory(gameId))
+// const difficulty: number = useSelector(selectDifficulty(gameId))
+
+// useEffect(() => {
+// // monaco.editor.getModels().forEach(model => model.dispose());
+
+// console.info(`trying to create model: ${gameId} ${worldId} ${levelId} ${uri}`)
+// const model = monaco.editor.createModel(initialCode ?? '', 'lean4', uri)
+// if (onDidChangeContent) {
+// model.onDidChangeContent(() => onDidChangeContent(model.getValue()))
+// }
+
+// const editor = monaco.editor.create(codeviewRef.current!, {
+// model,
+// glyphMargin: true,
+// quickSuggestions: false,
+// lineDecorationsWidth: 5,
+// folding: false,
+// lineNumbers: 'on',
+// lightbulb: {
+// enabled: true
+// },
+// unicodeHighlight: {
+// ambiguousCharacters: false,
+// },
+// automaticLayout: true,
+// minimap: {
+// enabled: false
+// },
+// lineNumbersMinChars: 3,
+// tabSize: 2,
+// 'semanticHighlighting.enabled': true,
+// fontFamily: "JuliaMono",
+// theme: 'vs-code-theme-converted'
+// })
+// if (onDidChangeSelection) {
+// editor.onDidChangeCursorSelection(() => onDidChangeSelection(editor.getSelections()))
+// }
+// if (initialSelections) {
+// console.debug("Initial Selection: ", initialSelections)
+// // BUG: Somehow I get an `invalid arguments` bug here
+// // editor.setSelections(initialSelections)
+// }
+// setEditor(editor)
+// const abbrevRewriter = new AbbreviationRewriter(new AbbreviationProvider(), model, editor)
+
+// const socketUrl = ((window.location.protocol === "https:") ? "wss://" : "ws://") + window.location.host + '/websocket/' + gameId
+
+// const connectionProvider : IConnectionProvider = {
+// get: async () => {
+// return await new Promise((resolve, reject) => {
+// console.log(`connecting ${socketUrl}`)
+// const websocket = new WebSocket(socketUrl)
+// websocket.addEventListener('error', (ev) => {
+// reject(ev)
+// })
+// websocket.addEventListener('message', (msg) => {
+// // console.log(msg.data)
+// })
+// websocket.addEventListener('open', () => {
+// const socket = toSocket(websocket)
+// const reader = new DisposingWebSocketMessageReader(socket)
+// const writer = new WebSocketMessageWriter(socket)
+// resolve({
+// reader,
+// writer
+// })
+// })
+// })
+// }
+// }
+
+// // Following `vscode-lean4/webview/index.ts`
+// const client = new LeanClient(connectionProvider, showRestartMessage, {inventory, difficulty})
+// const infoProvider = new InfoProvider(client)
+// // const div: HTMLElement = infoviewRef.current!
+// const imports = {
+// '@leanprover/infoview': `${window.location.origin}/index.production.min.js`,
+// 'react': `${window.location.origin}/react.production.min.js`,
+// 'react/jsx-runtime': `${window.location.origin}/react-jsx-runtime.production.min.js`,
+// 'react-dom': `${window.location.origin}/react-dom.production.min.js`,
+// 'react-popper': `${window.location.origin}/react-popper.production.min.js`
+// }
+// // loadRenderInfoview(imports, [infoProvider.getApi(), div], setInfoviewApi)
+// setInfoProvider(infoProvider)
+
+// // TODO: it looks like we get errors "File Changed" here.
+// client.restart("Lean4Game")
+
+// const editorApi = infoProvider.getApi()
+
+// const editorEvents: EditorEvents = {
+// initialize: new EventEmitter(),
+// gotServerNotification: new EventEmitter(),
+// sentClientNotification: new EventEmitter(),
+// serverRestarted: new EventEmitter(),
+// serverStopped: new EventEmitter(),
+// changedCursorLocation: new EventEmitter(),
+// changedInfoviewConfig: new EventEmitter(),
+// runTestScript: new EventEmitter(),
+// requestedAction: new EventEmitter(),
+// };
+
+// // Challenge: write a type-correct fn from `Eventify` to `T` without using `any`
+// const infoviewApi: InfoviewApi = {
+// initialize: async l => editorEvents.initialize.fire(l),
+// gotServerNotification: async (method, params) => {
+// editorEvents.gotServerNotification.fire([method, params]);
+// },
+// sentClientNotification: async (method, params) => {
+// editorEvents.sentClientNotification.fire([method, params]);
+// },
+// serverRestarted: async r => editorEvents.serverRestarted.fire(r),
+// serverStopped: async serverStoppedReason => {
+// editorEvents.serverStopped.fire(serverStoppedReason)
+// },
+// changedCursorLocation: async loc => editorEvents.changedCursorLocation.fire(loc),
+// changedInfoviewConfig: async conf => editorEvents.changedInfoviewConfig.fire(conf),
+// requestedAction: async action => editorEvents.requestedAction.fire(action),
+// // See https://rollupjs.org/guide/en/#avoiding-eval
+// // eslint-disable-next-line @typescript-eslint/no-implied-eval
+// runTestScript: async script => new Function(script)(),
+// getInfoviewHtml: async () => document.body.innerHTML,
+// };
+
+// const ec = new EditorConnection(editorApi, editorEvents);
+// setEditorConnection(ec)
+
+// editorEvents.initialize.on((loc: Location) => ec.events.changedCursorLocation.fire(loc))
+
+// setEditor(editor)
+// setInfoProvider(infoProvider)
+
+// infoProvider.openPreview(editor, infoviewApi)
+// const taskgutter = new LeanTaskGutter(infoProvider.client, editor)
+
+// // TODO:
+// // setRestart(() => restart)
+
+// return () => {
+// editor.dispose();
+// model.dispose();
+// abbrevRewriter.dispose();
+// taskgutter.dispose();
+// infoProvider.dispose();
+// client.dispose();
+// }
+// }, [gameId, worldId, levelId])
+
+// const showRestartMessage = () => {
+// // setRestartMessage(true)
+// console.log("TODO: SHOW RESTART MESSAGE")
+// }
+
+// return {editor, infoProvider, editorConnection}
+// }
diff --git a/client/src/components/markdown.tsx b/client/src/components/markdown.tsx
deleted file mode 100644
index 6ac64b7e..00000000
--- a/client/src/components/markdown.tsx
+++ /dev/null
@@ -1,19 +0,0 @@
-import * as React from 'react';
-import ReactMarkdown from 'react-markdown';
-import remarkMath from 'remark-math'
-import rehypeKatex from 'rehype-katex'
-import 'katex/dist/katex.min.css' // `rehype-katex` does not import the CSS for you
-import gfm from "remark-gfm";
-
-function Markdown(props) {
- const newProps = {
- ...props,
- remarkPlugins: [...props.remarkPlugins ?? [], remarkMath, gfm],
- rehypePlugins: [...props.remarkPlugins ?? [], rehypeKatex],
- };
- return (
-
- );
-}
-
-export default Markdown
diff --git a/client/src/components/message.tsx b/client/src/components/message.tsx
index 3883eb06..64b259cd 100644
--- a/client/src/components/message.tsx
+++ b/client/src/components/message.tsx
@@ -5,7 +5,7 @@ import '@fontsource/roboto/500.css';
import '@fontsource/roboto/700.css';
import { Button, Dialog, DialogContent, DialogContentText, DialogActions } from '@mui/material';
-import Markdown from './markdown';
+import { Markdown } from './utils';
function Message({ isOpen, content, close }) {
diff --git a/client/src/components/navigation.tsx b/client/src/components/navigation.tsx
new file mode 100644
index 00000000..1bf4816e
--- /dev/null
+++ b/client/src/components/navigation.tsx
@@ -0,0 +1,363 @@
+import * as React from 'react'
+import { createContext, useContext, useState } from 'react'
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
+import { faDownload, faUpload, faEraser, faBook, faBookOpen, faGlobe, faHome,
+ faArrowRight, faArrowLeft, faXmark, faBars, faCode,
+ faCircleInfo, faTerminal, faGear, IconDefinition, faShield } from '@fortawesome/free-solid-svg-icons'
+import { GameIdContext, PageContext, PreferencesContext } from "../state/context"
+import { useGetGameInfoQuery, useLoadLevelQuery } from '../state/api'
+import { downloadProgress } from './popup/erase'
+import { useTranslation } from 'react-i18next'
+import '../css/navigation.css'
+import { PopupContext } from './popup/popup'
+import { useSelector } from 'react-redux'
+import { selectCompleted, selectDifficulty, selectProgress, selectReadIntro } from '../state/progress'
+import lean4gameConfig from '../config.json'
+import { Flag } from './flag'
+import { useAppSelector } from '../hooks'
+
+/** SVG github icon */
+function GithubIcon () {
+ return
+
+
+}
+
+/** A button to appear in the navigation (both, top bar or dropdown). */
+export const NavButton: React.FC<{
+ icon?: IconDefinition
+ iconElement?: JSX.Element
+ text?: string
+ onClick?: React.MouseEventHandler
+ title?: string
+ href?: string
+ inverted?: boolean
+ disabled?: boolean
+ className?: string
+}> = ({icon, iconElement, text, onClick=()=>{}, title, href=null, inverted=false, disabled=false, className=''}) => {
+ return
+ {iconElement ?? (icon && )}{text && <> {text}>}
+
+}
+
+/** Context which manages the dropdown navigation */
+const NavigationContext = createContext<{
+ navOpen: boolean,
+ setNavOpen: React.Dispatch>
+}>({navOpen: false, setNavOpen: () => {}})
+
+/** Content of the navigation during game selection. */
+function NavigationLandingPage () {
+ return
+}
+
+/** Content of the navigation on Desktop during world selection. */
+function DesktopNavigationOverview () {
+ const { t } = useTranslation()
+ const { gameId } = useContext(GameIdContext)
+ const { setPopupContent } = useContext(PopupContext)
+ const gameInfo = useGetGameInfoQuery({game: gameId})
+
+ return
+
+ {setPopupContent("rules")}}
+ inverted={true} />
+
+
+ {t(gameInfo.data?.title, {ns: gameId})}
+
+
+
+}
+
+/** Content of the navigation on Mobile during world selection. */
+function MobileNavigationOverview () {
+ const { t } = useTranslation()
+ const {page, setPage} = useContext(PageContext)
+ const { setPopupContent } = useContext(PopupContext)
+
+ const { gameId, worldId } = useContext(GameIdContext)
+ const readIntro = useSelector(selectReadIntro(gameId, worldId))
+
+ return
+
+ {setPopupContent("rules")}}
+ inverted={true} />
+
+
+
+
+
+
+ {page > 0 &&
+ setPage(page - 1)}
+ inverted={true} />
+ }
+ { page < 2 &&
+ setPage(page+1)}
+ disabled={!readIntro}
+ inverted={true} />
+ }
+
+
+
+}
+
+/** Content of the navigation on Desktop in a level. */
+function DesktopNavigationLevel () {
+ const { t } = useTranslation()
+ const { gameId, worldId, levelId } = useContext(GameIdContext)
+ const { typewriterMode, setTypewriterMode, lockEditorMode } = useContext(PageContext)
+ const gameInfo = useGetGameInfoQuery({game: gameId})
+ const levelInfo = useLoadLevelQuery({game: gameId, world: worldId, level: levelId})
+ const difficulty = useSelector(selectDifficulty(gameId))
+ const completed = useAppSelector(selectCompleted(gameId, worldId, levelId))
+
+ const readIntro = useSelector(selectReadIntro(gameId, worldId))
+
+ const worldTitle = gameInfo.data?.worlds.nodes[worldId]?.title
+ const levelTitle = ((levelId == 0) ?
+ t("Introduction") :
+ (
+ t("Level") +
+ ` ${levelId}` +
+ (gameInfo.data?.worldSize[worldId] ? ` / ${gameInfo.data?.worldSize[worldId]}` : '') +
+ (levelInfo.data?.title ? ` : ${t(levelInfo?.data?.title, {ns: gameId})}` : '')
+ )
+ )
+
+ return
+
+ {worldTitle ? `${t(worldTitle, {ns: gameId})}` : '' /* ${t("World")}: */ }
+
+
+
+
+ { levelTitle
+ }
+
+
+
+ { levelId > 0 &&
+
+ }
+ { levelId == gameInfo.data?.worldSize[worldId] ?
+ 0 && difficulty == 2 && !completed}
+ href={`#/${gameId}`} /> :
+ = 1 && !(levelId == 0 ? readIntro : completed)}
+ href={`#/${gameId}/world/${worldId}/level/${levelId + 1}`} />
+ }
+
+
+}
+
+/** Content of the navigation on Mobile in a level. */
+function MobileNavigationLevel () {
+ const { t } = useTranslation()
+ const {gameId, worldId, levelId} = useContext(GameIdContext)
+ const {page, setPage} = useContext(PageContext)
+ const gameInfo = useGetGameInfoQuery({game: gameId})
+ const levelInfo = useLoadLevelQuery({game: gameId, world: worldId, level: levelId})
+
+ let title = worldId ?
+ ` ${levelId} / ${gameInfo.data?.worldSize[worldId]}`+ (levelInfo?.data?.title && ` : ${t(levelInfo?.data?.title, {ns: gameId})}`)
+ :
+ ''
+
+ return
+
+
+
+ {title}
+
+
+
+ setPage((page == 1) ? 2 : 1)}
+ inverted={true} />
+
+
+}
+
+/** The skeleton of the navigation which is the same across all layouts. */
+export function Navigation () {
+ const { t, i18n } = useTranslation()
+ const { gameId, worldId, levelId } = useContext(GameIdContext)
+ const { mobile, language, setLanguage } = useContext(PreferencesContext)
+ const { setPopupContent } = useContext(PopupContext)
+ const { typewriterMode, setTypewriterMode, lockEditorMode } = useContext(PageContext)
+ const gameProgress = useSelector(selectProgress(gameId))
+ const gameInfo = useGetGameInfoQuery({game: gameId})
+ const levelInfo = useLoadLevelQuery({game: gameId, world: worldId, level: levelId})
+ const difficulty = useSelector(selectDifficulty(gameId))
+ const completed = useAppSelector(selectCompleted(gameId, worldId, levelId))
+
+ const readIntro = useSelector(selectReadIntro(gameId, worldId))
+
+ const [navOpen, setNavOpen] = useState(false)
+ const [langNavOpen, setLangNavOpen] = useState(false)
+ function toggleNav () {setNavOpen(!navOpen); setLangNavOpen(false)}
+ function toggleLangNav () {setLangNavOpen(!langNavOpen); setNavOpen(false)}
+
+ /** toggle input mode if allowed */
+ function toggleInputMode(ev: React.MouseEvent) {
+ if (!lockEditorMode) {
+ setTypewriterMode(!typewriterMode)
+ console.log('test')
+ }
+ }
+
+ return
+
+ { gameId && <>
+
+ >}
+ { gameId ?
+ worldId ?
+ (mobile ? : ) :
+ (mobile ? : ) :
+
+ }
+ { !gameId &&
+ }
+ title={t("view the Lean game server on Github")}
+ href='https://github.com/leanprover-community/lean4game' />
+ }
+ {(!gameId || gameInfo.data?.tile?.languages.length > 1) &&
+ // Language button only visible if the game exists in `>1` languages
+ }
+ icon={langNavOpen ? faXmark : null}
+ title={langNavOpen ? t('close language menu') : t('open language menu')}
+ onClick={toggleLangNav}
+ />
+ }
+
+ { langNavOpen &&
+
+ {gameId && gameInfo.data?.tile?.languages ?
+ // Show all languages the game is available in
+ gameInfo.data?.tile?.languages.map(iso =>
+ }
+ text={lean4gameConfig.languages[iso]?.name}
+ onClick={() => {setLanguage(iso)}}
+ inverted={true} />) :
+ // Show all languages the interface is available in (e.g. landing page)
+ Object.entries(lean4gameConfig.languages).map(([iso, val]) =>
+ }
+ text={lean4gameConfig.languages[iso]?.name}
+ onClick={() => {setLanguage(iso)}}
+ inverted={true} />)
+ }
+
+ }
+ { navOpen &&
+
+ { gameId && <>
+ { mobile && (levelId == gameInfo.data?.worldSize[worldId] ?
+ 0 && difficulty == 2 && !completed}
+ href={`#/${gameId}`} /> :
+
+ )}
+ {mobile && levelId > 0 &&
+
+ }
+ { mobile && levelId > 0 &&
+ toggleInputMode(ev)}
+ title={lockEditorMode ? t("Editor mode is enforced!") : typewriterMode ? t("Editor mode") : t("Typewriter mode")} />
+ }
+ {setPopupContent("info")}}
+ inverted={true} />
+ {setPopupContent("erase")}}
+ inverted={true} />
+ {downloadProgress(gameId, gameProgress)}}
+ inverted={true} />
+ {setPopupContent("upload")}}
+ inverted={true} />
+ >}
+ {setPopupContent("impressum")}}
+ inverted={true} />
+ {setPopupContent("privacy")}}
+ inverted={true} />
+ {setPopupContent("preferences")}}
+ inverted={true} />
+
+ }
+
+
+}
diff --git a/client/src/components/popup/erase.tsx b/client/src/components/popup/erase.tsx
index 41f80059..de064f95 100644
--- a/client/src/components/popup/erase.tsx
+++ b/client/src/components/popup/erase.tsx
@@ -1,18 +1,18 @@
-/**
- * @fileOverview
-*/
import * as React from 'react'
import { useSelector } from 'react-redux'
-import { GameIdContext } from '../../app'
import { useAppDispatch } from '../../hooks'
-import { deleteProgress, selectProgress } from '../../state/progress'
+import { deleteLevelProgress, deleteProgress, deleteWorldProgress, selectProgress } from '../../state/progress'
import { downloadFile } from '../world_tree'
-import { Button } from '../button'
+import { Button } from '../utils'
import { Trans, useTranslation } from 'react-i18next'
+import { useContext } from 'react'
+import { PopupContext } from './popup'
+import { GameIdContext, PageContext } from '../../state/context'
/** download the current progress (i.e. what's saved in the browser store) */
-export function downloadProgress(gameId: string, gameProgress: any, ev: React.MouseEvent) {
- ev.preventDefault()
+export function downloadProgress(gameId: string, gameProgress) {
+
+ // ev.preventDefault()
downloadFile({
data: JSON.stringify(gameProgress, null, 2),
fileName: `lean4game-${gameId}-${new Date().toLocaleDateString()}.json`,
@@ -25,37 +25,60 @@ export function downloadProgress(gameId: string, gameProgress: any, ev: React.Mo
* `handleClose` is the function to close it again because it's open/closed state is
* controlled by the containing element.
*/
-export function ErasePopup ({handleClose}) {
+export function ErasePopup () {
let { t } = useTranslation()
- const gameId = React.useContext(GameIdContext)
+ const { gameId, worldId, levelId } = React.useContext(GameIdContext)
+ const { setPage } = useContext(PageContext)
const gameProgress = useSelector(selectProgress(gameId))
const dispatch = useAppDispatch()
+ const { setPopupContent } = useContext(PopupContext)
- const eraseProgress = () => {
+ const eraseProgress = (ev) => {
dispatch(deleteProgress({game: gameId}))
- handleClose()
+ setPopupContent(null)
+ setPage(0)
+ // ev.preventDefault() // TODO: this is a hack to prevent the buttons below from opening a link
+ }
+
+ function eraseLevel (ev) {
+ dispatch(deleteLevelProgress({game: gameId, world: worldId, level: levelId}))
+ setPopupContent(null)
+ ev.preventDefault()
+ }
+
+ function eraseWorld (ev) {
+ dispatch(deleteWorldProgress({game: gameId, world: worldId}))
+ setPopupContent(null)
+ ev.preventDefault()
}
const downloadAndErase = (ev) => {
- downloadProgress(gameId, gameProgress, ev)
- eraseProgress()
+ downloadProgress(gameId, gameProgress)
+ eraseProgress(ev)
}
- return
-
-
-
+ return <>
{t("Delete Progress?")}
Do you want to delete your saved progress irreversibly?
+
+
+ {t("Delete this Level")}
+ {t("Delete this World")}
+ {t("Delete Everything")}
+
+
+
+ Deleting everything will delete all your proofs and your collected inventory! It's recommended
+ to download your progress first.
+
- (This deletes your proofs and your collected inventory.
- Saves from other games are not deleted.)
+ (Saves from other games are not deleted.)
-
{t("Delete")}
-
{t("Download & Delete")}
-
{t("Cancel")}
-
-
+
+ {t("Download & Delete everything")}
+ {setPopupContent(null); ev.preventDefault()}} to="">{t("Cancel")}
+
+ >
}
diff --git a/client/src/components/popup/game_info.tsx b/client/src/components/popup/game_info.tsx
deleted file mode 100644
index 593c245e..00000000
--- a/client/src/components/popup/game_info.tsx
+++ /dev/null
@@ -1,28 +0,0 @@
-/**
- * @fileOverview
-*/
-import * as React from 'react'
-import { Typography } from '@mui/material'
-import Markdown from '../markdown'
-import { useTranslation } from 'react-i18next'
-import { GameIdContext } from '../../app'
-
-/** Pop-up that is displaying the Game Info.
- *
- * `handleClose` is the function to close it again because it's open/closed state is
- * controlled by the containing element.
- */
-export function InfoPopup ({info, handleClose}: {info: string, handleClose: () => void}) {
- let { t } = useTranslation()
- const gameId = React.useContext(GameIdContext)
-
- return
-
-
-
-
- {t(info, {ns: gameId})}
-
-
-
-}
diff --git a/client/src/components/popup/impressum.tsx b/client/src/components/popup/impressum.tsx
new file mode 100644
index 00000000..f9d36a2e
--- /dev/null
+++ b/client/src/components/popup/impressum.tsx
@@ -0,0 +1,43 @@
+import * as React from 'react'
+import { Trans, useTranslation } from 'react-i18next';
+
+/** Pop-up that is displayed when opening the privacy policy. */
+export function ImpressumPopup () {
+ let {t, i18n} = useTranslation()
+
+ function content (lng = i18n.language) {
+ const tt = i18n.getFixedT(lng);
+ return
+ Impressum
+
+ Contact:
+ Marcus Zibrowius, Jon Eugster
+ Mathematisches Institut der Heinrich-Heine-Universität Düsseldorf
+ Universitätsstr. 1
+ 40225 Düsseldorf
+ Germany
+ +49 211 81-14690
+ Contact Details
+
+
+ Legal form:
+ The Heinrich Heine University Düsseldorf is a corporation under public law. It is legally represented by the Rector Prof. Dr. Anja Steinbeck. The responsible supervisory authority is the Ministry of Culture and Science of North Rhine-Westphalia, Völklinger Straße 49, 40221 Düsseldorf.
+
+
+ VAT identification number:
+ according to §27a Sales Tax Act
+ DE 811222416
+
+ Impressum HHU
+
+ }
+
+ return <>
+ {i18n.language != 'en' && <>
+ (English version below)
+ {content()}
+
+ >}
+ {content('en')}
+ >
+}
diff --git a/client/src/components/popup/info.tsx b/client/src/components/popup/info.tsx
new file mode 100644
index 00000000..b74f5d9d
--- /dev/null
+++ b/client/src/components/popup/info.tsx
@@ -0,0 +1,56 @@
+import * as React from 'react'
+import { Typography } from '@mui/material'
+import { Markdown } from '../utils'
+import { Trans, useTranslation } from 'react-i18next'
+import { useGetGameInfoQuery } from '../../state/api'
+import { GameIdContext } from '../../state/context'
+
+/** Pop-up that is displaying the Game Info.
+ *
+ * `handleClose` is the function to close it again because it's open/closed state is
+ * controlled by the containing element.
+ */
+export function InfoPopup () {
+ let { t } = useTranslation()
+ const {gameId} = React.useContext(GameIdContext)
+ const gameInfo = useGetGameInfoQuery({game: gameId})
+
+ return <>
+
+ {t(gameInfo.data?.info, {ns: gameId})}
+
+
+ Progress saving
+
+ The game stores your progress in your local browser storage. If you delete it, your progress will be lost!
+ Warning: In most browsers, deleting cookies will also clear the local storage (or "local site data").
+ Make sure to download your game progress first!
+
+ Accessibility
+
+ If you experience any accessibilty barriers, please get in contact with us!
+ We are dedicated to address such barriers to the best of our abilities.
+
+ Development
+ The game engine has been created by Alexander Bentkamp , Jon Eugster .
+ On a prototype by Patrick Massot .
+
+
+ The source code of this Lean game engine
+ is available on Github .
+ If you experience any problems, please
+ file an Issue on Github or
+ get directly in contact.
+
+ Funding
+
+ The game engine has been developed as part of the
+ project ADAM: Anticipating the Digital
+ Age of Mathematics at
+ Heinrich-Heine-Universität Düsseldorf. It is funded by
+ the Stiftung Innovation in der Hochschullehre as part of project Freiraum 2022 .
+
+
+
+ >
+}
diff --git a/client/src/components/popup/popup.tsx b/client/src/components/popup/popup.tsx
new file mode 100644
index 00000000..10576f5c
--- /dev/null
+++ b/client/src/components/popup/popup.tsx
@@ -0,0 +1,58 @@
+import * as React from 'react'
+import { useContext } from 'react'
+import { PrivacyPolicyPopup } from './privacy'
+import { ImpressumPopup } from './impressum'
+import { InfoPopup } from './info'
+import { ErasePopup } from './erase'
+import { PreferencesPopup } from './preferences'
+import { UploadPopup } from './upload'
+import { RulesPopup } from './rules'
+import '../../css/popup.css'
+import { NavButton } from '../navigation'
+import { faXmark } from '@fortawesome/free-solid-svg-icons'
+
+/** The context which manages if a popup is shown.
+ * If `popupContent` is `null`, the popup is closed.
+ */
+export const PopupContext = React.createContext<{
+ popupContent: string,
+ setPopupContent: React.Dispatch>
+}>({
+ popupContent: null,
+ setPopupContent: () => {}
+})
+
+/** To create a new Popup, one needs to add its content as `React.JSX.Element` here
+ * and then call `setPopupConent(key)` at the place where to popup should be opened.
+ *
+ * TODO: The drawback of this design is that there is no check for key missmatches.
+ * How could that be achieved?
+ */
+export const Popups = {
+ "erase": ,
+ "impressum": ,
+ "info": ,
+ "preferences": ,
+ "privacy": ,
+ "rules": ,
+ "upload": ,
+}
+
+/** The skeleton for the popups. */
+export function Popup () {
+ const {popupContent, setPopupContent} = useContext(PopupContext)
+ function closePopup() {
+ setPopupContent(null)
+ }
+
+ return
+
+
+ {/*
*/}
+
+ {Popups[popupContent]}
+
+
+}
diff --git a/client/src/components/popup/preferences.tsx b/client/src/components/popup/preferences.tsx
index 9e77ec67..0e279ea1 100644
--- a/client/src/components/popup/preferences.tsx
+++ b/client/src/components/popup/preferences.tsx
@@ -1,6 +1,6 @@
import * as React from 'react'
import { Input, MenuItem, Select, SelectChangeEvent, Typography } from '@mui/material'
-import Markdown from '../markdown'
+import { Markdown } from '../utils'
import { Switch, Button, ButtonGroup } from '@mui/material';
import Box from '@mui/material/Box';
import Slider from '@mui/material/Slider';
@@ -8,14 +8,15 @@ import lean4gameConfig from '../../config.json'
import FormControlLabel from '@mui/material/FormControlLabel';
-import { IPreferencesContext, PreferencesContext } from "../infoview/context"
+import { IPreferencesContext, PreferencesContext } from "../../state/context"
import ReactCountryFlag from 'react-country-flag';
import { useTranslation } from 'react-i18next';
-export function PreferencesPopup({ handleClose }: { handleClose: () => void }) {
+export function PreferencesPopup () {
let { t } = useTranslation()
const {layout, isSavePreferences, language, setLayout, setIsSavePreferences, setLanguage} = React.useContext(PreferencesContext)
+
const marks = [
{
value: 0,
@@ -34,7 +35,7 @@ export function PreferencesPopup({ handleClose }: { handleClose: () => void }) {
},
];
- const handlerChangeLayout = (_: Event, value: number) => {
+ const handlerChangeLayout = (_: Event, value: any) => {
setLayout(marks[value].key as IPreferencesContext["layout"])
}
@@ -42,10 +43,7 @@ export function PreferencesPopup({ handleClose }: { handleClose: () => void }) {
setLanguage(ev.target.value as IPreferencesContext["language"])
}
- return
-
-
-
+ return <>
@@ -59,12 +57,23 @@ export function PreferencesPopup({ handleClose }: { handleClose: () => void }) {
value={language}
label={t("Language")}
onChange={handlerChangeLanguage}>
- {lean4gameConfig.languages.map(lang => {return
{lang.name} })}
+ {Object.entries(lean4gameConfig.languages).map(([iso, val]) => {
+ return
+ {lean4gameConfig.useFlags && }
+
+ {val.name}
+
+ })}
}
label=""
/>
+
+ If a game does not exist in the language selected, this setting has no effect
+ and the game's default language is used.
+
+
@@ -77,7 +86,7 @@ export function PreferencesPopup({ handleClose }: { handleClose: () => void }) {
item.key === layout).value}
+ value={marks.find(item => item.key === layout)?.value}
step={1}
marks={marks}
max={2}
@@ -110,6 +119,5 @@ export function PreferencesPopup({ handleClose }: { handleClose: () => void }) {
-
-
+ >
}
diff --git a/client/src/components/popup/privacy.tsx b/client/src/components/popup/privacy.tsx
new file mode 100644
index 00000000..8a92f3b7
--- /dev/null
+++ b/client/src/components/popup/privacy.tsx
@@ -0,0 +1,48 @@
+import * as React from 'react'
+import { Trans, useTranslation } from 'react-i18next';
+
+/** Pop-up that is displayed when opening the privacy policy.
+ *
+ * Note: Do not translate the Impressum!
+ */
+export function PrivacyPolicyPopup () {
+ let {t, i18n} = useTranslation()
+ function content (lng = i18n.language) {
+ const tt = i18n.getFixedT(lng);
+ return
+ Privacy Policy
+
+ Our server collects metadata (such as IP address, browser, operating system)
+ and the data that the user enters into the editor. The data is used to
+ compute the Lean output and display it to the user. The information will be stored
+ as long as the user stays on our website and will be deleted immediately afterwards.
+ We keep logs to improve our software, but the contained data is anonymized.
+
+
+ We do not use cookies, but your game progress is stored in the browser
+ as site data. Your game progress is not saved on the server; if you delete
+ your browser storage, it is completely gone.
+
+ Our server is located in Germany.
+
+ Contact:
+ Marcus Zibrowius, Jon Eugster
+ Mathematisches Institut der Heinrich-Heine-Universität Düsseldorf
+ Universitätsstr. 1
+ 40225 Düsseldorf
+ Germany
+ +49 211 81-14690
+ Contact Details
+
+
+ }
+
+ return <>
+ {i18n.language != 'en' && <>
+ (English version below)
+ {content()}
+
+ >}
+ {content('en')}
+ >
+}
diff --git a/client/src/components/popup/privacy_policy.tsx b/client/src/components/popup/privacy_policy.tsx
deleted file mode 100644
index f205abb1..00000000
--- a/client/src/components/popup/privacy_policy.tsx
+++ /dev/null
@@ -1,61 +0,0 @@
-/**
- * @fileOverview The impressum/privacy policy
-*/
-import { faShield } from '@fortawesome/free-solid-svg-icons';
-import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
-import * as React from 'react'
-
-/** Pop-up that is displayed when opening the privacy policy.
- *
- * `handleClose` is the function to close it again because it's open/closed state is
- * controlled by the containing element.
- *
- * Note: Do not translate the Impressum!
- */
-export function PrivacyPolicyPopup ({handleClose}: {handleClose: () => void}) {
- return
-
-
-
-
Privacy Policy & Impressum
-
- Our server collects metadata (such as IP address, browser, operating system)
- and the data that the user enters into the editor. The data is used to
- compute the Lean output and display it to the user. The information will be stored
- as long as the user stays on our website and will be deleted immediately afterwards.
- We keep logs to improve our software, but the contained data is anonymized.
-
-
- We do not use cookies, but your game progress is stored in the browser
- as site data. Your game progress is not saved on the server; if you delete
- your browser storage, it is completely gone.
-
-
Our server is located in Germany.
-
- Contact information:
- Alexander Bentkamp, Jon Eugster
- Mathematisches Institut der Heinrich-Heine-Universität Düsseldorf
- Universitätsstr. 1
- 40225 Düsseldorf
- Germany
- +49 211 81-12173
- Contact Details
-
-
Development & Funding
-
- The source code of this Lean game engine
- is available on Github .
- If you experience any problems, please
- file an Issue on Github or
- get directly in contact.
-
-
- The game engine has been developed as part of the
- project ADAM: Anticipating the Digital
- Age of Mathematics at
- Heinrich-Heine-Universität Düsseldorf. It is funded by
- the Stiftung Innovation in der Hochschullehre as part of project Freiraum 2022 .
-
-
-
-}
diff --git a/client/src/components/popup/rules.tsx b/client/src/components/popup/rules.tsx
new file mode 100644
index 00000000..be88c3bc
--- /dev/null
+++ b/client/src/components/popup/rules.tsx
@@ -0,0 +1,88 @@
+import { Box, Slider } from '@mui/material'
+import * as React from 'react'
+import { Trans, useTranslation } from 'react-i18next'
+import { changedDifficulty, selectDifficulty } from '../../state/progress'
+import { useSelector } from 'react-redux'
+import { useContext } from 'react'
+import { useAppDispatch } from '../../hooks'
+import { GameIdContext } from '../../state/context'
+
+/** Pop-up that is displayed when opening the help explaining the game rules.
+ *
+ */
+export function RulesPopup () {
+ const { t } = useTranslation()
+ const { gameId } = useContext(GameIdContext)
+ const difficulty = useSelector(selectDifficulty(gameId))
+ const dispatch = useAppDispatch()
+
+ function label(x : number) {
+ return x == 0 ? t("none") : x == 1 ? t("relaxed") : t("regular")
+ }
+
+ return <>
+ {t("Game Rules")}
+
+ {/* {t("Rules")}
+ (setRulesHelp(!rulesHelp))}/>
+ */}
+
+ {
+ dispatch(changedDifficulty({game: gameId, difficulty: val}))
+ }}
+ />
+
+
+
+ Game rules determine if it is allowed to skip levels and if the games runs checks to only
+ allow unlocked tactics and theorems in proofs.
+
+
+ Note: "Unlocked" tactics (or theorems) are determined by two things: The set of minimal
+ tactics needed to solve a level, plus any tactics you unlocked in another level. That means
+ if you unlock simp in a level, you can use it henceforth in any level.
+
+ The options are:
+
+
+
+
+
+ {t("levels")}
+ {t("tactics")}
+
+
+
+
+ {t("regular")}
+ 🔐
+ 🔐
+
+
+ {t("relaxed")}
+ 🔓
+ 🔐
+
+
+ {t("none")}
+ 🔓
+ 🔓
+
+
+
+ >
+}
diff --git a/client/src/components/popup/rules_help.tsx b/client/src/components/popup/rules_help.tsx
deleted file mode 100644
index cb16af52..00000000
--- a/client/src/components/popup/rules_help.tsx
+++ /dev/null
@@ -1,60 +0,0 @@
-/**
- * @fileOverview
-*/
-import * as React from 'react'
-import { Trans, useTranslation } from 'react-i18next'
-
-/** Pop-up that is displayed when opening the help explaining the game rules.
- *
- * `handleClose` is the function to close it again because it's open/closed state is
- * controlled by the containing element.
- */
-export function RulesHelpPopup ({handleClose}: {handleClose: () => void}) {
- const { t } = useTranslation()
-
- return
-
-
-
-
{t("Game Rules")}
-
-
- Game rules determine if it is allowed to skip levels and if the games runs checks to only
- allow unlocked tactics and theorems in proofs.
-
-
- Note: "Unlocked" tactics (or theorems) are determined by two things: The set of minimal
- tactics needed to solve a level, plus any tactics you unlocked in another level. That means
- if you unlock simp in a level, you can use it henceforth in any level.
-
- The options are:
-
-
-
-
-
- {t("levels")}
- {t("tactics")}
-
-
-
-
- {t("regular")}
- 🔐
- 🔐
-
-
- {t("relaxed")}
- 🔓
- 🔐
-
-
- {t("none")}
- 🔓
- 🔓
-
-
-
-
-
-}
diff --git a/client/src/components/popup/upload.tsx b/client/src/components/popup/upload.tsx
index 0a9d9ecf..b6f99800 100644
--- a/client/src/components/popup/upload.tsx
+++ b/client/src/components/popup/upload.tsx
@@ -3,26 +3,30 @@
*/
import * as React from 'react'
import { useSelector } from 'react-redux'
-import { GameIdContext } from '../../app'
import { useAppDispatch } from '../../hooks'
import { GameProgressState, loadProgress, selectProgress } from '../../state/progress'
import { downloadFile } from '../world_tree'
-import { Button } from '../button'
+import { Button } from '../utils'
import { Trans, useTranslation } from 'react-i18next'
+import { PopupContext } from './popup'
+import { useContext } from 'react'
+import { GameIdContext } from '../../state/context'
/** Pop-up that is displaying the Game Info.
*
* `handleClose` is the function to close it again because it's open/closed state is
* controlled by the containing element.
*/
-export function UploadPopup ({handleClose}) {
+export function UploadPopup () {
let { t } = useTranslation()
const [file, setFile] = React.useState();
- const gameId = React.useContext(GameIdContext)
+ const {gameId} = React.useContext(GameIdContext)
const gameProgress = useSelector(selectProgress(gameId))
const dispatch = useAppDispatch()
+ const { setPopupContent } = useContext(PopupContext)
+
const handleFileChange = (e) => {
if (e.target.files) {
setFile(e.target.files[0])
@@ -39,7 +43,7 @@ export function UploadPopup ({handleClose}) {
console.debug("Json Data", data)
dispatch(loadProgress({game: gameId, data: data}))
}
- handleClose()
+ setPopupContent(null) // close the popup
}
/** Download the current progress (i.e. what's saved in the browser store) */
@@ -53,10 +57,7 @@ export function UploadPopup ({handleClose}) {
}
- return
-
-
-
+ return <>
{t("Upload Saved Progress")}
Select a JSON file with the saved game progress to load your progress.
@@ -69,7 +70,7 @@ export function UploadPopup ({handleClose}) {
- {t("Load selected file")}
-
-
+ {/* TODO: apperently clicking this redirects the user back to the landing page... */}
+ {t("Load selected file")}
+ >
}
diff --git a/client/src/components/utils.tsx b/client/src/components/utils.tsx
new file mode 100644
index 00000000..d5643801
--- /dev/null
+++ b/client/src/components/utils.tsx
@@ -0,0 +1,43 @@
+import * as React from 'react'
+import { Link, LinkProps } from "react-router-dom"
+import { Box, CircularProgress } from "@mui/material"
+import ReactMarkdown from 'react-markdown'
+import remarkMath from 'remark-math'
+import rehypeKatex from 'rehype-katex'
+import rehypeRaw from 'rehype-raw'
+import 'katex/dist/katex.min.css' // `rehype-katex` does not import the CSS for you
+import gfm from "remark-gfm"
+
+/** Simple loading icon */
+export function LoadingIcon () {
+ return
+
+
+}
+
+export interface ButtonProps extends LinkProps {
+ disabled?: boolean
+ inverted?: string // Apparently "inverted" in DOM cannot be `boolean` but must be `inverted`
+}
+
+
+/** Our own button class */
+export function Button(props: ButtonProps) {
+ if (props.disabled) {
+ return {props.children}
+ } else {
+ return {props.children}
+ }
+}
+
+/** Spiced-up markdown */
+export function Markdown(props) {
+ const newProps = {
+ ...props,
+ remarkPlugins: [...props.remarkPlugins ?? [], remarkMath, gfm],
+ rehypePlugins: [...props.remarkPlugins ?? [], rehypeKatex, rehypeRaw],
+ };
+ return (
+
+ );
+}
diff --git a/client/src/components/welcome.tsx b/client/src/components/welcome.tsx
deleted file mode 100644
index ecc1c74e..00000000
--- a/client/src/components/welcome.tsx
+++ /dev/null
@@ -1,151 +0,0 @@
-import * as React from 'react'
-import { useEffect } from 'react'
-import Split from 'react-split'
-import { Box, CircularProgress } from '@mui/material'
-import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
-import { faArrowRight } from '@fortawesome/free-solid-svg-icons'
-
-import { GameIdContext } from '../app'
-import { useAppDispatch, useAppSelector } from '../hooks'
-import { changedOpenedIntro, selectOpenedIntro } from '../state/progress'
-import { useGetGameInfoQuery, useLoadInventoryOverviewQuery } from '../state/api'
-import { Button } from './button'
-import { PreferencesContext } from './infoview/context'
-import { InventoryPanel } from './inventory'
-import { ErasePopup } from './popup/erase'
-import { InfoPopup } from './popup/game_info'
-import { PrivacyPolicyPopup } from './popup/privacy_policy'
-import { RulesHelpPopup } from './popup/rules_help'
-import { UploadPopup } from './popup/upload'
-import { PreferencesPopup} from "./popup/preferences"
-import { WorldTreePanel } from './world_tree'
-
-import '../css/welcome.css'
-import { WelcomeAppBar } from './app_bar'
-import { Hint } from './hints'
-import i18next from 'i18next'
-import { useTranslation } from 'react-i18next'
-
-
-/** the panel showing the game's introduction text */
-function IntroductionPanel({introduction, setPageNumber}: {introduction: string, setPageNumber}) {
- const {mobile} = React.useContext(PreferencesContext)
- const gameId = React.useContext(GameIdContext)
-
- let { t } = useTranslation()
-
- const dispatch = useAppDispatch()
-
- // TODO: I left the setup for splitting up the introduction in place, but if it's not needed
- // then this can be simplified.
-
- // let text: Array = introduction.split(/\n(\s*\n)+/)
- let text: Array = introduction ? [t(introduction, {ns : gameId})] : []
-
- return
-
- {text?.map(((t, i) =>
- t.trim() ?
-
- : <>>
- ))}
-
- {mobile &&
-
- {
- setPageNumber(1);
- dispatch(changedOpenedIntro({game: gameId, openedIntro: true}))
- }}>
- Start
-
-
- }
-
-}
-
-/** main page of the game showing among others the tree of worlds/levels */
-function Welcome() {
- const gameId = React.useContext(GameIdContext)
-
- // Load the namespace of the game
- i18next.loadNamespaces(gameId)
-
- const {mobile} = React.useContext(PreferencesContext)
- const {layout, isSavePreferences, language, setLayout, setIsSavePreferences, setLanguage} = React.useContext(PreferencesContext)
-
- const gameInfo = useGetGameInfoQuery({game: gameId})
- const inventory = useLoadInventoryOverviewQuery({game: gameId})
-
- // For mobile only
- const openedIntro = useAppSelector(selectOpenedIntro(gameId))
- const [pageNumber, setPageNumber] = React.useState(openedIntro ? 1 : 0)
-
- // pop-ups
- const [eraseMenu, setEraseMenu] = React.useState(false)
- const [impressum, setImpressum] = React.useState(false)
- const [info, setInfo] = React.useState(false)
- const [rulesHelp, setRulesHelp] = React.useState(false)
- const [uploadMenu, setUploadMenu] = React.useState(false)
- const [preferencesPopup, setPreferencesPopup] = React.useState(false)
-
- function closeEraseMenu() {setEraseMenu(false)}
- function closeImpressum() {setImpressum(false)}
- function closeInfo() {setInfo(false)}
- function closeRulesHelp() {setRulesHelp(false)}
- function closeUploadMenu() {setUploadMenu(false)}
- function closePreferencesPopup() {setPreferencesPopup(false)}
- function toggleEraseMenu() {setEraseMenu(!eraseMenu)}
- function toggleImpressum() {setImpressum(!impressum)}
- function toggleInfo() {setInfo(!info)}
- function toggleUploadMenu() {setUploadMenu(!uploadMenu)}
- function togglePreferencesPopup() {setPreferencesPopup(!preferencesPopup)}
-
- // set the window title
- useEffect(() => {
- if (gameInfo.data?.title) {
- window.document.title = gameInfo.data.title
- }
- }, [gameInfo.data?.title])
-
- return gameInfo.isLoading ?
-
-
-
- : <>
-
-
- { mobile ?
-
- {(pageNumber == 0 ?
-
- : pageNumber == 1 ?
-
- :
-
- )}
-
- :
-
-
-
-
-
- }
-
- {impressum ? : null}
- {rulesHelp ? : null}
- {eraseMenu? : null}
- {uploadMenu? : null}
- {info ? : null}
- {preferencesPopup ? : null}
- >
-}
-
-export default Welcome
diff --git a/client/src/components/world_tree.tsx b/client/src/components/world_tree.tsx
index 6e57a574..2a52ad00 100644
--- a/client/src/components/world_tree.tsx
+++ b/client/src/components/world_tree.tsx
@@ -3,21 +3,18 @@
*/
import * as React from 'react'
import { Link } from 'react-router-dom'
-import { useStore, useSelector } from 'react-redux'
-import { Slider } from '@mui/material'
+import { useSelector } from 'react-redux'
import cytoscape, { LayoutOptions } from 'cytoscape'
import klay from 'cytoscape-klay'
-import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
-import { faXmark, faCircleQuestion } from '@fortawesome/free-solid-svg-icons'
-import { GameIdContext } from '../app'
-import { useAppDispatch } from '../hooks'
-import { selectDifficulty, changedDifficulty, selectCompleted } from '../state/progress'
+import { selectDifficulty, selectCompleted } from '../state/progress'
import { store } from '../state/store'
import '../css/world_tree.css'
-import { PreferencesContext } from './infoview/context'
+import { GameIdContext } from '../state/context'
import { useTranslation } from 'react-i18next'
+import { useGetGameInfoQuery } from '../state/api'
+import { LoadingIcon } from './utils'
// Settings for the world tree
cytoscape.use( klay )
@@ -65,7 +62,7 @@ export function LevelIcon({ world, level, position, completed, unlocked, worldSi
// Sinus-Satz: (1.1*r) / sin(β/2) = R / sin(π/2)
let R = 1.1 * r / Math.sin(beta/2)
- const gameId = React.useContext(GameIdContext)
+ const {gameId} = React.useContext(GameIdContext)
const difficulty = useSelector(selectDifficulty(gameId))
const levelDisabled = (difficulty >= 2 && !(unlocked || completed))
@@ -137,7 +134,7 @@ export function WorldIcon({world, title, position, completedLevels, difficulty,
nextLevel = 0
}
let playable = difficulty <= 1 || completed || unlocked
- const gameId = React.useContext(GameIdContext)
+ const {gameId} = React.useContext(GameIdContext)
return
-
- {t("Rules")}
- (setRulesHelp(!rulesHelp))}/>
-
- {
- dispatch(changedDifficulty({game: gameId, difficulty: val}))
- }}
- >
-
-
-}
-
export function computeWorldLayout(worlds) {
let elements = []
for (let id in worlds.nodes) {
@@ -271,15 +227,14 @@ export function computeWorldLayout(worlds) {
}
-export function WorldTreePanel({worlds, worldSize, rulesHelp, setRulesHelp}:
- { worlds: any,
- worldSize: any,
- rulesHelp: boolean,
- setRulesHelp: any,
- }) {
- const gameId = React.useContext(GameIdContext)
+export function WorldTreePanel ({visible = true}) {
+ const {gameId} = React.useContext(GameIdContext)
const difficulty = useSelector(selectDifficulty(gameId))
- const {nodes, bounds}: any = worlds ? computeWorldLayout(worlds) : {nodes: []}
+ const gameInfo = useGetGameInfoQuery({game: gameId})
+
+
+ const {nodes, bounds}: any = gameInfo.data?.worlds ? computeWorldLayout(gameInfo.data?.worlds) : {nodes: []}
+
// scroll to playable world
React.useEffect(() => {
@@ -292,7 +247,7 @@ export function WorldTreePanel({worlds, worldSize, rulesHelp, setRulesHelp}:
console.debug(`scrolling to ${elem.textContent}`)
elem.scrollIntoView({block: "center"})
}
- }, [worlds, worldSize])
+ }, [gameInfo])
let svgElements = []
@@ -301,18 +256,18 @@ export function WorldTreePanel({worlds, worldSize, rulesHelp, setRulesHelp}:
// Indices `1, …, n` indicate if the corresponding level is completed
var completed = {}
- if (worlds && worldSize) {
+ if (gameInfo.data?.worlds && gameInfo.data?.worldSize) {
// Fill `completed` with the level data.
for (let worldId in nodes) {
- completed[worldId] = Array.from({ length: worldSize[worldId] + 1 }, (_, i) => {
+ completed[worldId] = Array.from({ length: gameInfo.data?.worldSize[worldId] + 1 }, (_, i) => {
// index `0` starts off as `true` but can be set to `false` by any edge with non-completed source
return i == 0 || selectCompleted(gameId, worldId, i)(store.getState())
})
}
// draw all connecting paths
- for (let i in worlds.edges) {
- const edge = worlds.edges[i]
+ for (let i in gameInfo.data?.worlds.edges) {
+ const edge = gameInfo.data?.worlds.edges[i]
let sourceCompleted = completed[edge[0]].slice(1).every(Boolean)
// if the origin world is not completed, mark the target world as non-playable
if (!sourceCompleted) {completed[edge[1]][0] = false}
@@ -332,11 +287,11 @@ export function WorldTreePanel({worlds, worldSize, rulesHelp, setRulesHelp}:
completedLevels={completed[worldId]}
difficulty={difficulty}
key={`${gameId}-${worldId}`}
- worldSize={worldSize[worldId]}
+ worldSize={gameInfo.data?.worldSize[worldId]}
/>
)
- for (let i = 1; i <= worldSize[worldId]; i++) {
+ for (let i = 1; i <= gameInfo.data?.worldSize[worldId]; i++) {
svgElements.push(
)
}
@@ -359,13 +314,14 @@ export function WorldTreePanel({worlds, worldSize, rulesHelp, setRulesHelp}:
let dx = bounds ? s*(bounds.x2 - bounds.x1) + 2*padding : null
- return
-
+ return
+ {/* */}
+ { gameInfo.data ?
{svgElements}
-
+ : }
}
diff --git a/client/src/config.json b/client/src/config.json
index 70075a68..2067bd5b 100644
--- a/client/src/config.json
+++ b/client/src/config.json
@@ -6,7 +6,6 @@
"trequetrum/lean4game-logic",
"jadabouhawili/knightsandknaves-lean4game"
],
-
"languages": [
{
"iso": "en",
@@ -18,16 +17,16 @@
"flag": "DE",
"name": "Deutsch"
},
- {
- "iso": "zh",
- "flag": "CN",
- "name": "中文"
- },
{
"iso": "es",
"flag": "ES",
"name": "Español"
},
+ {
+ "iso": "zh",
+ "flag": "CN",
+ "name": "中文"
+ },
{
"iso": "ko",
"flag": "KR",
@@ -43,5 +42,6 @@
"flag": "IT",
"name": "Italiano"
}
- ]
+ ],
+ "useFlags": false
}
diff --git a/client/src/css/app.css b/client/src/css/app.css
index 206638df..d1b5ceb3 100644
--- a/client/src/css/app.css
+++ b/client/src/css/app.css
@@ -6,18 +6,25 @@
--clr-light-gray: #ddd;
--clr-dark-gray: #aaa;
--clr-darker-gray: #555;
- --ff-primary: Roboto;
}
/* General styling */
+html, body, #root, .app {
+ height: 100%;
+}
+
body {
- font-family: var(--ff-primary);
+ font-family: "Roboto", sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
+.hidden {
+ display: none !important;
+}
+
.markdown code {
color: rgba(0, 32, 90, 0.87);
background-color: rgba(223, 227, 234);
@@ -75,6 +82,7 @@ body {
.btn-disabled, .btn[disabled] {
color: var(--clr-dark-gray);
background: var(--clr-light-gray);
+ cursor: not-allowed;
}
.btn-inverted.btn-disabled, .btn-inverted.btn[disabled] {
@@ -88,16 +96,12 @@ em {
/* App Bar */
-#root {
- height: 100%;
-}
-
.app {
- height: 100%;
display: flex;
flex-direction: column;
}
+/* TODO: remove */
.app-bar {
flex: 0;
background: var(--clr-primary);
@@ -126,14 +130,6 @@ em {
/* margin: 0 1em; */
}
-.app-content {
- height: 100%;
- flex: 1;
- min-height: 0;
- display: flex;
-}
-
-
.markdown li ul, .markdown li ol {
margin:0 1.5em;
}
@@ -142,6 +138,40 @@ em {
margin:0 1.5em 1.5em 1.5em;
}
-.privacy-policy {
- z-index: 10;
+/* TODO: should not be #root */
+#root code {
+ font-family: "JuliaMono", monospace;
+}
+
+@font-face {
+ font-family: 'JuliaMono';
+ src: local('JuliaMono'), url('/fonts/JuliaMono-Regular.ttf') format('truetype');
+}
+
+@font-face {
+ font-family: 'Roboto';
+ src: local('Roboto'), url('/fonts/Roboto-Regular.ttf') format('truetype');
+}
+
+h1 {
+ font-size: 2em;
+ margin: .67em 0;
+}
+
+h2 {
+ font-size: 1.5em;
+}
+
+h3 {
+ font-size: 1.3em;
+}
+
+h4 {
+ font-size: 1.1em;
+ font-style: italic;
+}
+
+h5, h6 {
+ font-size: 1em;
+ font-style: italic;
}
diff --git a/client/src/css/chat.css b/client/src/css/chat.css
new file mode 100644
index 00000000..1d370f4a
--- /dev/null
+++ b/client/src/css/chat.css
@@ -0,0 +1,99 @@
+.chat {
+ flex: 1;
+ overflow-y: scroll;
+ margin-left: .5em;
+ margin-right: .5em;
+}
+
+.chat-panel {
+ padding-top: 0;
+ padding-bottom: 0;
+ overflow: hidden;
+ display: flex;
+ flex-direction: column;
+
+}
+
+.button-row {
+ /* width:100%; */
+ /* margin-left: .5em;
+ margin-right: .5em; */
+ min-height: 2.5em;
+ border-top: 0.1em solid #aaa;
+ display: flex;
+ padding-top: .2rem;
+ margin: .5rem;
+
+}
+
+.button-row > .btn:not(:last-child), .button-row > .btn-placeholder:not(:last-child) {
+ /* display: block; */
+ margin-right: .2rem;
+}
+
+.button-row .btn-placeholder {
+ display: inline-block;
+ flex: 1;
+ margin: 0;
+}
+
+.button-row .btn {
+ flex: 1;
+ /* margin-top: 1rem;
+ margin-bottom: 1rem;
+ margin-left: .5rem;
+ margin-right: .5rem; */
+ text-align: center;
+ margin: 0;
+ padding: .5em;
+}
+
+
+.message {
+ margin: 10px 0;
+ padding: 5px 10px;
+ border-radius: 3px 3px 3px 3px;
+}
+
+.message.information, .message.info, .message.kind-5, .message.kind-3, .message.kind-4 {
+ /* color: #059; */
+ color: #000;
+ background-color: #DDF6FF;
+}
+
+.message.warning, .message.kind-2 {
+ color: #9F6000;
+ background-color: #FEEFB3;
+}
+
+.message.error, .message.kind-1 {
+ color: #D8000C;
+ background-color: #FFBABA;
+}
+
+.message.deleted-hint {
+ background-color: #EEE;
+ color: #777;
+ box-shadow: .0em .0em .5em .2em #EEE;
+ }
+
+.message.success, , .message.kind-6 {
+ color: #000;
+ background-color: #E5FFDD;
+}
+
+.chat .message {
+ margin-left: .5em;
+ margin-right: .5em;
+ overflow-x: auto;
+}
+
+.chat .recent {
+ box-shadow: .0em .0em .4em .1em #8cbbe9;
+}
+
+.chat .selected {
+ /* border: 3px solid #5191d1; */
+
+ box-shadow: .0em .0em .4em .1em var(--clr-primary);
+}
diff --git a/client/src/css/editor.css b/client/src/css/editor.css
new file mode 100644
index 00000000..7c6edc16
--- /dev/null
+++ b/client/src/css/editor.css
@@ -0,0 +1,27 @@
+.editor-wrapper {
+ flex: 1;
+ position: relative;
+}
+
+.editor-wrapper .editor-split {
+ height: 100%;
+}
+
+#editor {
+ height: 400px;
+}
+
+#infoview {
+ height: 400px;
+}
+
+#infoview iframe {
+ width: 100%;
+ height: 95%; /* TODO: setting this to 100% makes it a few pixels too high... */
+ border: unset;
+}
+
+/* .typewriter {
+ background-color: lightpink;
+ min-height: 400px;
+} */
diff --git a/client/src/css/error_page.css b/client/src/css/error_page.css
new file mode 100644
index 00000000..6650e9ee
--- /dev/null
+++ b/client/src/css/error_page.css
@@ -0,0 +1,60 @@
+#error-page {
+ height: 100vh;
+ background-image: url("/RoboSurprised.png");
+ background-repeat: no-repeat;
+ background-size: contain;
+ background-position: right bottom;
+}
+
+/* these colours are matching the ones of `.messages.error` */
+.error-message{
+ border: 2px solid #D8000C;
+ background-color: #FFBABA;
+ border-radius: 1rem;
+ display: inline-block;
+ margin: 3rem;
+ padding-left: 1rem;
+ padding-right: 1rem;
+ /* color: #D8000C; */
+ position: relative;
+}
+
+
+.thought-bubble {
+ border: 2px solid #D8000C;
+ background-color: #FFBABA;
+ position: absolute;
+ display: block;
+}
+
+.thought-bubble:nth-of-type(1) {
+ bottom: -3.5rem;
+ left: 1rem;
+ border-radius: 1.2rem;
+ width: 2.4rem;
+ height: 2.4rem;
+}
+
+.thought-bubble:nth-of-type(2) {
+ bottom: -6rem;
+ left: 2.5rem;
+ border-radius: 1rem;
+ width: 2rem;
+ height: 2rem;
+}
+
+.thought-bubble:nth-of-type(3) {
+ bottom: -7.5rem;
+ left: 4.5rem;
+ border-radius: 0.8rem;
+ width: 1.6rem;
+ height: 1.6rem;
+}
+
+.thought-bubble:nth-of-type(4) {
+ bottom: -8.2rem;
+ left: 6.8rem;
+ border-radius: 0.6rem;
+ width: 1.4rem;
+ height: 1.4rem;
+}
diff --git a/client/src/css/game.css b/client/src/css/game.css
new file mode 100644
index 00000000..79998649
--- /dev/null
+++ b/client/src/css/game.css
@@ -0,0 +1,37 @@
+.app-content {
+ height: 100%;
+ flex: 1;
+ min-height: 0;
+ display: flex;
+}
+
+.gutter {
+ background-color: #eee;
+
+ background-repeat: no-repeat;
+ background-position: 50%;
+}
+
+.gutter.gutter-vertical {
+ background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAFAQMAAABo7865AAAABlBMVEVHcEzMzMzyAv2sAAAAAXRSTlMAQObYZgAAABBJREFUeF5jOAMEEAIEEFwAn3kMwcB6I2AAAAAASUVORK5CYII=');
+}
+
+.gutter.gutter-horizontal {
+ background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAeCAYAAADkftS9AAAAIklEQVQoU2M4c+bMfxAGAgYYmwGrIIiDjrELjpo5aiZeMwF+yNnOs5KSvgAAAABJRU5ErkJggg==');
+}
+
+
+.column {
+ width: 100%;
+ height: 100%;
+ overflow: auto;
+ position: relative;
+ scroll-behavior: smooth;
+}
+
+.slider .column {
+ height: 100%;
+ overflow: auto;
+ position: relative;
+ scroll-behavior: smooth;
+}
diff --git a/client/src/css/infoview.css b/client/src/css/infoview.css
index 987a175c..0d9baff6 100644
--- a/client/src/css/infoview.css
+++ b/client/src/css/infoview.css
@@ -1,28 +1,4 @@
-.message {
- margin: 10px 0;
- padding: 5px 10px;
- border-radius: 3px 3px 3px 3px;
-}
-.message.information, .message.info {
- /* color: #059; */
- color: #000;
- background-color: #DDF6FF;
-}
-.message.warning {
- color: #9F6000;
- background-color: #FEEFB3;
-}
-.message.error {
- color: #D8000C;
- background-color: #FFBABA;
-}
-
-.message.deleted-hint {
- background-color: #eee;
- color: #777;
- box-shadow: .0em .0em .5em .2em #eee;
- }
.hyp-group {
margin-bottom: 0.3em;
@@ -50,69 +26,6 @@
}
-.typewriter {
- background: var(--clr-primary);
- padding: 0.5em;
- font-family: var(--ff-primary);
- border-radius: 0.2em;
- /* margin: 0.2em 0 0; */
-}
-
-.typewriter.disabled{
- background: #bbb;
-}
-
-.typewriter.disabled .btn-inverted,
-.typewriter.disabled .mtk1 {
- color: #777;
-}
-
-.typewriter.disabled .typewriter-input-wrapper,
-.typewriter.disabled .monaco-editor,
-.typewriter.disabled .monaco-editor-background,
-.typewriter.disabled .btn-inverted {
- background-color: #eee;
-}
-
-.typewriter form {
- display: flex;
-}
-
-.typewriter button, .undo-button {
- display: block;
- white-space: nowrap;
- flex: 0;
-}
-
-.typewriter .typewriter-input-wrapper{
- min-width: 0;
- flex: 1;
- padding: 0.4em .6em 0;
- font-size: 1rem;
- background: white;
- display: flex;
- flex-direction: column;
-}
-
-.typewriter-interface .proof .MuiCircularProgress-root {
- left: 50%;
- position: relative;
- margin-left: -20px;
- margin-bottom: 0.6em;
-}
-
-.typewriter .typewriter-input {
- flex: 1;
-}
-
-/* Turn off some monaco decorations: */
-.typewriter-input .monaco-editor .view-overlays .current-line {
- border: 0;
-}
-.typewriter-input .monaco-editor .scroll-decoration {
- box-shadow: none;
-}
-
.other-goals .goals-section-title, .other-goals summary, .other-goals summary .font-code {
color: #5191d1;
}
@@ -122,8 +35,8 @@
flex-direction: row;
}
-.goals-section div {
- flex-grow: 1;
+.goal-tabs {
+ width: 100%;
}
#current-proof, #main-assumptions {
@@ -167,22 +80,12 @@
}
-/* Push the goals to the bottom for now, until we insert the proof history above. */
-.typewriter-interface .content {
- display: flex;
- flex-direction: column;
- scroll-behavior: smooth;
-}
/* TODO this is in the wrong file */
.chat {
scroll-behavior: smooth;
}
-.typewriter-interface .content .tmp-pusher {
- flex: 1;
-}
-
.exercise .command {
background-color: #bbb;
padding: .5em;
@@ -210,8 +113,8 @@
.exercise .command-text {
flex: 1;
background-color: #fff;
- font-family: "Droid Sans Mono", "monospace", monospace;
font-size: 14px;
+ font-family: "JuliaMono", monospace;
padding: 0.4em .6em 0;
}
@@ -225,3 +128,43 @@
padding-left: .5em;
padding-right: .5em;
}
+
+/* Apparently this prevents the layout from jumping around when hovering over expressions. */
+.tooltip-arrow {
+ display: none;
+}
+
+
+.goal-tab {
+ /* border: 2px dotted darkgreen; */
+ padding: .2rem;
+ display: flex;
+ flex-direction: row;
+ font-family: "JuliaMono", monospace;
+}
+
+.goal-tab .hyp-group-title {
+ font-family: "Roboto", sans-serif;
+}
+
+.goal-tab .goal, .goal-tab .hypotheses {
+ /* border: 1px solid lightblue; */
+ display: inline-block;
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+}
+
+.goal-sign {
+ /* border: 1px solid lightblue; */
+ width: 1rem;
+ margin-left: .5rem;
+ margin-right: .5rem;
+ display: inline-block;
+}
+
+.goal-sign line {
+ stroke: var(--clr-dark-gray);
+ stroke-width: 2;
+}
diff --git a/client/src/css/inventory.css b/client/src/css/inventory.css
index fb6fb0f0..f515b135 100644
--- a/client/src/css/inventory.css
+++ b/client/src/css/inventory.css
@@ -10,6 +10,7 @@
.documentation h1 {
font-weight: 900;
+ font-family: "JuliaMono", monospace;
}
.documentation.hidden {
@@ -33,9 +34,15 @@
position: relative;
}
+.inventory .item, .inventory .tab-bar:not(.major) .tab {
+ font-family: "JuliaMono", monospace;
+ font-size: .9rem;
+}
+
.inventory .item.locked {
border: solid 1px #ccc;
color: #ccc;
+ background-color: #f2f2f2;
}
.inventory .item.disabled {
@@ -46,13 +53,21 @@
background-color: rgb(255, 242, 190);
}
-.inventory .item:not(.locked), .inventory .item.enabled {
+.inventory .item.current-world {
+ background-color: rgb(250, 231, 255);
+}
+
+.inventory .item.recent {
+ background-color: rgb(242, 190, 255);
+}
+
+.inventory .item, .inventory .item.enabled {
cursor: pointer;
}
.tab-bar {
border-bottom: 0.1em solid var(--clr-dark-gray);
- margin-bottom: 0.5em;
+ margin-bottom: 1em;
}
.tab {
@@ -67,11 +82,43 @@
display: inline-block;
}
+.tab-bar.major {
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+ padding-top: .5em;
+ font-weight: bold;
+}
+
+.tab-bar.major .tab {
+ flex: 1;
+ text-align: center;
+ font-size: 1.2em;
+ padding-left: 0;
+ padding-right: 0;
+}
+
.tab-bar.current .tab.active {
color: black;
border-bottom: 0.3em solid var(--clr-primary);
}
+.inventory .tab.recent {
+ background-image: linear-gradient(to bottom, rgba(255,0,0,0), rgb(242, 190, 255));
+}
+
+.inventory .tab.recent:not(.active) {
+ border-bottom: 0.3em solid rgb(242, 190, 255);
+}
+
+.inventory .tab.new {
+ background-image: linear-gradient(to bottom, rgba(255,0,0,0), rgb(255, 242, 190));
+}
+
+.inventory .tab.new:not(.active) {
+ border-bottom: 0.3em solid rgb(255, 242, 190);
+}
+
.tab.active {
color: black;
border-bottom: 0.3em solid #999;
@@ -94,3 +141,13 @@
align-items: end;
text-align: end;
}
+
+.documentation .nav-button {
+ float: right;
+ font-size: 1.5rem;
+}
+
+.documentation .nav-button.lock {
+ float: left;
+ font-size: .7rem;
+}
diff --git a/client/src/css/landing_page.css b/client/src/css/landing_page.css
index 4831c9f2..f1a8b6b8 100644
--- a/client/src/css/landing_page.css
+++ b/client/src/css/landing_page.css
@@ -9,10 +9,6 @@ html {
font-size: 16px;
}
-body {
- font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
-}
-
a {
text-decoration: none;
}
@@ -165,12 +161,12 @@ header {
font-style: italic;
}
-header nav {
+/* header nav {
display: flex;
justify-content: flex-end;
padding: 8px;
background-color: rgba(0, 133, 162, .7);
-}
+} */
footer {
background-color: rgba(0, 133, 162, 1);
@@ -231,3 +227,7 @@ footer .link {
margin-right: calc(50% - 650px);
}
}
+
+.info .languages span + span {
+ margin-left: .5em;
+}
diff --git a/client/src/css/level.css b/client/src/css/level.css
index d6fbb7ec..3ae80273 100644
--- a/client/src/css/level.css
+++ b/client/src/css/level.css
@@ -5,31 +5,12 @@
/* display: flex; */
}
-.hidden {
- display: none;
-}
-
-.gutter {
- background-color: #eee;
-
- background-repeat: no-repeat;
- background-position: 50%;
-}
-
-.gutter.gutter-vertical {
- background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAFAQMAAABo7865AAAABlBMVEVHcEzMzMzyAv2sAAAAAXRSTlMAQObYZgAAABBJREFUeF5jOAMEEAIEEFwAn3kMwcB6I2AAAAAASUVORK5CYII=');
-}
-
-.gutter.gutter-horizontal {
- background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAeCAYAAADkftS9AAAAIklEQVQoU2M4c+bMfxAGAgYYmwGrIIiDjrELjpo5aiZeMwF+yNnOs5KSvgAAAABJRU5ErkJggg==');
-}
-
-.inventory-panel, .exercise-panel, .doc-panel, .introduction-panel {
+/* .inventory-panel, .exercise-panel, .doc-panel, .introduction-panel {
height: 100%;
width: 100%;
overflow: auto;
position: relative;
-}
+} */
.infoview {
padding-top: 1em;
@@ -63,11 +44,11 @@
padding-top: 0em;
}
-.exercise {
+/* .exercise {
flex: 1 1 auto;
display: flex;
flex-flow: column;
-}
+} */
.codeview {
flex: 1 1 auto;
@@ -193,70 +174,21 @@ td code {
.exercise {
height: 100%;
-}
-
-.chat {
- flex: 1;
- overflow-y: scroll;
- margin-left: .5em;
- margin-right: .5em;
-}
-
-.chat-panel {
- padding-top: 0;
- padding-bottom: 0;
- overflow: hidden;
- display: flex;
- flex-direction: column;
-
-}
-
-.chat-panel .button-row {
- /* width:100%; */
- margin-left: .5em;
- margin-right: .5em;
- min-height: 2.5em;
- border-top: 0.1em solid #aaa;
-}
-
-.chat-panel .btn {
- margin-top: 1rem;
- margin-bottom: 1rem;
- margin-left: .5rem;
- margin-right: .5rem;
-}
-
-/* .exercise-panel {
- display: flex;
- flex-flow: column;
- height: 100%;
-} */
-
-.button-row.mobile {
- margin: .5rem;
- padding-top: .2rem;
-}
-
-.button-row.mobile .btn {
- padding: .5em;
- border-radius: .2em;
width: 100%;
- margin: 0;
- text-align: center;
}
-
-.typewriter-interface {
+.exercise-content {
display: flex;
flex-flow: column;
height: 100%;
+ z-index: 1;
}
.typewriter {
flex: 0 1 auto;
}
-.typewriter-interface .content {
+.exercise-content {
flex: 1 1 auto;
overflow-y: scroll;
padding: 0;
@@ -276,16 +208,7 @@ td code {
margin-top: 10px;
}
-.chat .message {
- margin-left: .5em;
- margin-right: .5em;
-}
-
-.chat .recent {
- box-shadow: .0em .0em .4em .1em #8cbbe9;
-}
-
-.exercise .step.selected .goal-tabs, .chat .selected {
+.exercise .step.selected .goal-tab {
/* border: 3px solid #5191d1; */
box-shadow: .0em .0em .4em .1em var(--clr-primary);
}
@@ -314,7 +237,7 @@ td code {
right: 0;
top: 100%;
background-color: #fff;
- z-index: 1;
+ z-index: 10;
border-top: 1px solid rgba(0, 0, 0, 0.1);
border-bottom: 1px solid rgba(0, 0, 0, 0.1);
box-shadow: -.1rem .3rem .3rem 0 rgba(0, 0, 0, 0.1);
@@ -341,22 +264,31 @@ td code {
justify-content: center;
}
-.typewriter-interface .content, .world-image-container.empty {
+.exercise {
background-color: #eee;
+ position: relative;
}
-.world-image-container {
+.world-image {
+ height: 100%;
+ width: 100%;
+ overflow: hidden;
display: flex;
flex-direction: column;
- min-height: 0px; /* somehow this has a desired affect, but why? */
- overflow: hidden;
+ position: absolute;
+ z-index: 0;
+ /* min-height: 0px;*/ /* somehow this has a desired affect, but why? */
}
-.world-image-container img.contain {
+.world-image img.contain {
+ height: 100%;
+ width: 100%;
object-fit: contain;
+ object-position: top center;
+ pointer-events: none;
}
-.world-image-container.center {
+.world-image.center {
justify-content: center;
}
@@ -366,10 +298,43 @@ td code {
object-fit: cover;
}
-.typewriter-interface .proof {
+.proof {
+ z-index: 2;
background-color: #fff;
}
+.exercise-content .tmp-pusher {
+ flex: 1;
+}
+
+.exercise-content {
+ background: none;
+}
+
+.editor-mode .proof {
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+}
+
+.editor-mode .tmp-pusher {
+ height: 0;
+}
+
+/* Push the goals to the bottom for now, until we insert the proof history above. */
+.exercise-content {
+ display: flex;
+ flex-direction: column;
+ scroll-behavior: smooth;
+}
+
+.exercise-content .proof .MuiCircularProgress-root {
+ left: 50%;
+ position: relative;
+ margin-left: -20px;
+ margin-bottom: 0.6em;
+}
+
.toggle-width {
min-width: 40px;
text-align: center;
@@ -393,3 +358,16 @@ td code {
background: #DDF6FF;
text-align: center;
}
+
+#unicode-input, .lean-abbrev-input {
+ min-width: 0;
+ white-space: pre;
+ flex: 1;
+ /* padding: 0.4em .6em 0; */
+ font-size: var(--vscode-editor-font-size);
+ background-color: white;
+ border: 2px solid orange;
+ display: flex;
+ flex-direction: column;
+ font-family: JuliaMono, monospace;
+}
diff --git a/client/src/css/navigation.css b/client/src/css/navigation.css
new file mode 100644
index 00000000..00b570e4
--- /dev/null
+++ b/client/src/css/navigation.css
@@ -0,0 +1,213 @@
+
+nav {
+ flex: 0;
+ background: var(--clr-primary);
+ display: flex;
+ position: relative;
+ flex-direction: row;
+ justify-content: space-between;
+ align-items: center;
+ padding: 1.1em;
+ filter: drop-shadow(0 0 5px rgba(0,0,0,0.5));
+ z-index: 10;
+}
+
+.nav-content {
+ flex: 1;
+ display: flex;
+}
+
+.nav-content > div {
+ /* border: 1px solid red; */
+ text-align: center;
+}
+
+.nav-title-left, .nav-title-right {
+ flex-grow: 0;
+ flex-shrink: 0;
+ display: flex;
+ align-items: center;
+}
+
+.nav-title-middle {
+ flex-grow: 1;
+ flex-shrink: 1;
+ margin-left: .5rem;
+ margin-right: .5rem;
+}
+
+.nav-title {
+ color: white;
+ font-weight: 500;
+ font-size: 1.3rem;
+ display: inline-block;
+ margin: 0;
+ /* margin: 0 1em; */
+}
+
+/* fix to make toggle buttons work */
+.svg-inline--fa {
+ width: 1em;
+}
+
+/* TODO */
+.nav-button:not(.btn-inverted) {
+ font-size: 1.3rem;
+}
+
+.dropdown {
+ z-index: 10;
+}
+
+.dropdown {
+ position: absolute;
+ display: flex;
+ flex-direction: column;
+ right: 0;
+ top: 100%;
+ background-color: #fff;
+ z-index: 10;
+ border-top: 1px solid rgba(0, 0, 0, 0.1);
+ border-bottom: 1px solid rgba(0, 0, 0, 0.1);
+ box-shadow: -.1rem .3rem .3rem 0 rgba(0, 0, 0, 0.1);
+}
+
+.dropdown .svg-inline--fa {
+ width: 1.8rem;
+}
+
+.btn-right {
+ float: right;
+ margin: 0.2rem;
+}
+
+.btn-input-mode {
+ position: absolute;
+ right: 0.4rem;
+ z-index: 3;
+ top: 0.4rem;
+ margin: 0;
+ border: 1px solid var(--clr-primary);
+ background-color: #eee;
+ font-size: .7rem;
+ /* box-shadow: .0em .0em .4em .1em var(--clr-primary); */
+ /* box-shadow: -.1rem .3rem .3rem 0 var(--clr-primary); */
+ /* border-top-right-radius: 0;
+ border-bottom-right-radius: 0; */
+}
+
+.mobile-nav .svg-inline--fa {
+ margin-left: 0.3rem;
+ margin-right: 0.3rem;
+}
+
+.modal-wrapper {
+ z-index: 10;
+}
+
+.modal hr {
+ margin-top: 3rem;
+ margin-bottom: 3rem;
+ border-color: var(--vscode-breadcrumb-foreground);
+}
+
+/* For the "Rules" popup. */
+.slider-wrapper {
+ padding-left: 2rem;
+ padding-right: 2rem;
+ padding-top: 1rem;
+}
+
+.modal-close {
+ float: right;
+ scale: 2;
+ color: var(--vscode-breadcrumb-foreground);
+ cursor: pointer;
+}
+
+.modal-close:hover {
+ float: right;
+ scale: 2;
+ color: var(--vscode-breadcrumb-focusForeground);
+}
+
+.modal .nav-button {
+ float: right;
+ font-size: 1.5rem;
+}
+
+.settings-buttons .btn {
+ margin-top: 0.2rem;
+ margin-bottom: 0.2rem;
+}
+
+.modal-wrapper {
+ position: fixed;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ padding: 0;
+}
+
+.modal-backdrop {
+ position: fixed;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ background: rgba(0, 0, 0, 0.25);
+ z-index: 6;
+}
+
+.modal h2 {
+ text-align: center;
+}
+
+.modal {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ transform: translate(-50%, -50%);
+ min-width: max(50%, 300px);
+ max-width: 60ch;
+ max-height: 80%;
+ overflow: scroll;
+ background: #fff;
+ z-index: 7;
+ padding: 2em;
+ border-radius: 1em;
+ text-align: left;
+ color: var(--vscode-breadcrumb-foreground);
+}
+
+.modal input[type="text"] {
+ width: 100%;
+}
+
+.modal .form-error {
+ color: #a00;
+ font-weight: bold;
+}
+
+.modal input[type="submit"] {
+ border: none;
+ color: var(--vscode-button-foreground);
+ background: var(--vscode-button-background);
+ cursor: pointer;
+ padding: .5em 1em;
+ border-radius: .2em;
+ display: block;
+ margin: 1em auto;
+}
+
+.modal table {
+ width: 100%;
+}
+
+.modal a.download-link {
+ cursor: pointer;
+ font-style: italic;
+ text-decoration: underline dotted;
+
+}
diff --git a/client/src/css/popup.css b/client/src/css/popup.css
new file mode 100644
index 00000000..e69de29b
diff --git a/client/src/css/typewriter.css b/client/src/css/typewriter.css
new file mode 100644
index 00000000..eed840d7
--- /dev/null
+++ b/client/src/css/typewriter.css
@@ -0,0 +1,55 @@
+.typewriter {
+ background: var(--clr-primary);
+ padding: 0.5em;
+ font-family: var(--ff-primary);
+ border-radius: 0.2em;
+ /* margin: 0.2em 0 0; */
+}
+
+.typewriter.disabled{
+ background: #bbb;
+}
+
+.typewriter.disabled .btn-inverted,
+.typewriter.disabled .mtk1 {
+ color: #777;
+}
+
+.typewriter.disabled .typewriter-input-wrapper,
+.typewriter.disabled .monaco-editor,
+.typewriter.disabled .monaco-editor-background,
+.typewriter.disabled .btn-inverted {
+ background-color: #eee;
+}
+
+.typewriter form {
+ display: flex;
+}
+
+.typewriter button, .undo-button {
+ display: block;
+ white-space: nowrap;
+ flex: 0;
+}
+
+.typewriter .typewriter-input-wrapper{
+ min-width: 0;
+ flex: 1;
+ padding: 0.4em .6em 0;
+ font-size: 1rem;
+ background: white;
+ display: flex;
+ flex-direction: column;
+}
+
+.typewriter .typewriter-input {
+ flex: 1;
+}
+
+/* Turn off some monaco decorations: */
+.typewriter-input .monaco-editor .view-overlays .current-line {
+ border: 0;
+}
+.typewriter-input .monaco-editor .scroll-decoration {
+ box-shadow: none;
+}
diff --git a/client/src/css/welcome.css b/client/src/css/welcome.css
index e48f7d08..e448d7e7 100644
--- a/client/src/css/welcome.css
+++ b/client/src/css/welcome.css
@@ -14,9 +14,6 @@
width: 100%;
}
-.app-content {
- height: 100%
-}
.welcome .column {
height: 100%;
@@ -35,28 +32,6 @@ i {
font-style: italic;
}
-h1 {
- font-size: 2em;
- margin: .67em 0;
-}
-
-h2 {
- font-size: 1.5em;
-}
-
-h3 {
- font-size: 1.3em;
-}
-
-h4 {
- font-size: 1.1em;
- font-style: italic;
-}
-
-h5, h6 {
- font-size: 1em;
- font-style: italic;
-}
/******************/
/* Privacy Button */
@@ -95,99 +70,6 @@ h5, h6 {
right: 1.5px;
}
-/*****************/
-/* Privacy Popup */
-/*****************/
-
-.modal-wrapper {
- position: fixed;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- padding: 0;
-}
-
-.modal-backdrop {
- position: fixed;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- background: rgba(0, 0, 0, 0.25);
- z-index: 2;
-}
-
-.modal h2 {
- text-align: center;
-}
-
-.modal {
- position: absolute;
- top: 50%;
- left: 50%;
- transform: translate(-50%, -50%);
- min-width: max(50%, 300px);
- max-width: 60ch;
- max-height: 80%;
- overflow: scroll;
- background: #fff;
- z-index: 3;
- padding: 2em;
- border-radius: 1em;
- text-align: left;
- color: var(--vscode-breadcrumb-foreground);
-}
-
-.modal input[type="text"] {
- width: 100%;
-}
-
-.modal .form-error {
- color: #a00;
- font-weight: bold;
-}
-
-.modal input[type="submit"] {
- border: none;
- color: var(--vscode-button-foreground);
- background: var(--vscode-button-background);
- cursor: pointer;
- padding: .5em 1em;
- border-radius: .2em;
- display: block;
- margin: 1em auto;
-}
-
-.modal-close {
- float: right;
- scale: 2;
- color: var(--vscode-breadcrumb-foreground);
- cursor: pointer;
-}
-
-.modal-close:hover {
- float: right;
- scale: 2;
- color: var(--vscode-breadcrumb-focusForeground);
-}
-
-.modal table {
- width: 100%;
-}
-
-.modal a.download-link {
- cursor: pointer;
- font-style: italic;
- text-decoration: underline dotted;
-
-}
-
-.mobile-nav .svg-inline--fa {
- margin-left: 0.3rem;
- margin-right: 0.3rem;
-}
-
.preferences-category.tail-category{
margin-top: 2em;
}
@@ -198,4 +80,4 @@ h5, h6 {
.preferences-item.leave-left-gap{
margin-left: 3em;
-}
\ No newline at end of file
+}
diff --git a/client/src/i18n.ts b/client/src/i18n.ts
index a2db8a82..faf8d0a3 100644
--- a/client/src/i18n.ts
+++ b/client/src/i18n.ts
@@ -11,7 +11,8 @@ i18n
// > see https://github.com/i18next/i18next-http-backend
loadPath: function(lngs, namespaces: Array
) {
if (namespaces[0].startsWith("g/")) {
- return '/i18n/{{ns}}/{{lng}}/Game.json';
+ // return '/i18n/{{ns}}/{{lng}}/Game.json';
+ return '/i18n/{{ns}}/{{lng}}/Game.po';
} else {
return '/locales/{{lng}}/{{ns}}.json';
}
diff --git a/client/src/index.tsx b/client/src/index.tsx
index f91f3776..016ae7ac 100644
--- a/client/src/index.tsx
+++ b/client/src/index.tsx
@@ -6,33 +6,30 @@ import { Provider } from 'react-redux'
import type { RouteObject } from "react-router"
import { createHashRouter, RouterProvider, Route, redirect } from "react-router-dom"
import ErrorPage from './components/error_page'
-import Welcome from './components/welcome'
import LandingPage from './components/landing_page'
-import Level from './components/level'
-import './i18n';
+import './i18n'
+import Game from './components/game'
// If `VITE_LEAN4GAME_SINGLE` is set to true, then `/` should be redirected to
// `/g/local/game`. This is used for the devcontainer setup
let single_game = (import.meta.env.VITE_LEAN4GAME_SINGLE == "true")
-let root_object: RouteObject = single_game ? {
- path: "/",
- loader: () => redirect("/g/local/game")
-} : {
- path: "/",
- element: ,
- errorElement: ,
- children: [
- {
- path: "/",
- element: ,
- }
- ]
-}
+// let root_object: RouteObject = single_game ? {
+// path: "/",
+// loader: () => redirect("/g/local/game")
+// }
+
+let landing_page: RouteObject = single_game ? {
+ path: "/",
+ loader: () => redirect("/g/local/game")
+ } : {
+ path: "/",
+ element: ,
+ }
const router = createHashRouter([
- root_object,
+ // root_object,
{
// For backwards compatibility
path: "/game/nng",
@@ -44,28 +41,29 @@ const router = createHashRouter([
loader: () => redirect("/g/leanprover-community/nng4")
},
{
- path: "/g/:owner/:repo",
+ path: "/",
element: ,
errorElement: ,
children: [
+ landing_page,
{
path: "/g/:owner/:repo",
- element: ,
+ element: ,
},
{
path: "/g/:owner/:repo/world/:worldId/level/:levelId",
- element: ,
+ element: ,
},
],
},
-]);
+])
-const container = document.getElementById('root');
-const root = createRoot(container!);
+const container = document.getElementById('root')
+const root = createRoot(container!)
root.render(
-);
+)
diff --git a/client/src/state/api.ts b/client/src/state/api.ts
index 1a645978..8b9ef4b5 100644
--- a/client/src/state/api.ts
+++ b/client/src/state/api.ts
@@ -36,6 +36,9 @@ export interface InventoryTile {
new: boolean,
hidden: boolean
altTitle: string,
+ world : string|null,
+ level : number|null,
+ proven : boolean
}
export interface LevelInfo {
@@ -44,11 +47,11 @@ export interface LevelInfo {
conclusion: null|string,
index: number,
tactics: InventoryTile[],
- lemmas: InventoryTile[],
+ theorems: InventoryTile[],
definitions: InventoryTile[],
descrText: null|string,
descrFormat: null|string,
- lemmaTab: null|string,
+ theoremTab: null|string,
statementName: null|string,
displayName: null|string,
template: null|string,
@@ -58,9 +61,9 @@ export interface LevelInfo {
/** Used to display the inventory on the welcome page */
export interface InventoryOverview {
tactics: InventoryTile[],
- lemmas: InventoryTile[],
+ theorems: InventoryTile[],
definitions: InventoryTile[],
- lemmaTab: null,
+ theoremTab: null,
}
interface Doc {
@@ -81,13 +84,19 @@ export const apiSlice = createApi({
query: ({game}) => `${game}/game.json`,
}),
loadLevel: builder.query({
- query: ({game, world, level}) => `${game}/level__${world}__${level}.json`,
+ query: ({game, world, level}) => {
+ if (world && level > 0) {
+ return `${game}/level__${world}__${level}.json`
+ } else {
+ return `${game}/inventory.json`
+ }
+ },
}),
loadInventoryOverview: builder.query({
query: ({game}) => `${game}/inventory.json`,
}),
- loadDoc: builder.query({
- query: ({game, type, name}) => `${game}/doc__${type}__${name}.json`,
+ loadDoc: builder.query({
+ query: ({game, name}) => `${game}/doc__${name}.json`,
}),
}),
})
diff --git a/client/src/components/infoview/context.ts b/client/src/state/context.ts
similarity index 72%
rename from client/src/components/infoview/context.ts
rename to client/src/state/context.ts
index e6dd6ee7..47307374 100644
--- a/client/src/components/infoview/context.ts
+++ b/client/src/state/context.ts
@@ -5,14 +5,25 @@ import * as React from 'react';
import * as monaco from 'monaco-editor/esm/vs/editor/editor.api.js'
import { InteractiveDiagnostic } from '@leanprover/infoview-api';
import { Diagnostic } from 'vscode-languageserver-types'
-import { GameHint, InteractiveGoal, InteractiveTermGoal,InteractiveGoalsWithHints, ProofState } from './rpc_api';
-import { PreferencesState } from '../../state/preferences';
+import { GameHint, InteractiveGoal, InteractiveTermGoal, InteractiveGoalsWithHints, ProofState } from '../components/editor/Defs';
+import { PreferencesState } from './preferences';
+import { LeanMonaco, LeanMonacoEditor } from 'lean4monaco';
+import { RpcSessionAtPos } from 'lean4monaco/dist/vscode-lean4/vscode-lean4/src/infoview';
-export const MonacoEditorContext = React.createContext(
- null as any)
+export const MonacoEditorContext = React.createContext<{
+ leanMonacoEditor: LeanMonacoEditor
+ leanMonaco: LeanMonaco
+ rpcSess: RpcSessionAtPos
+}>(null)
export type InfoStatus = 'updating' | 'error' | 'ready';
+
+export const GameIdContext = React.createContext<{
+ gameId: string,
+ worldId: string|null,
+ levelId: number|null}>({gameId: null, worldId: null, levelId: null});
+
// /** One step of the proof */
// export type ProofStep = {
// /** The command in this step */
@@ -93,36 +104,45 @@ export const PreferencesContext = React.createContext({
setLanguage: () => {},
})
-export const WorldLevelIdContext = React.createContext<{
- worldId : string,
- levelId: number
-}>({
- worldId : null,
- levelId: 0,
-})
-/** Context to keep highlight selected proof step and corresponding chat messages. */
-export const SelectionContext = React.createContext<{
- selectedStep : number,
+export const ChatContext = React.createContext<{
+ selectedStep : number
setSelectedStep: React.Dispatch>
-}>({
- selectedStep : undefined,
- setSelectedStep: () => {}
-})
-
-/** Context for deleted Hints that are visible just a bit after they've been deleted */
-export const DeletedChatContext = React.createContext<{
- deletedChat : GameHint[],
+ deletedChat : GameHint[]
setDeletedChat: React.Dispatch>>
- showHelp : Set,
+ showHelp : Set
setShowHelp: React.Dispatch>>
+ chatRef: React.MutableRefObject
}>({
+ selectedStep : undefined,
+ setSelectedStep: () => {},
deletedChat: undefined,
setDeletedChat: () => {},
showHelp: undefined,
- setShowHelp: () => {}
+ setShowHelp: () => {},
+ chatRef: null
})
+export const PageContext = React.createContext<{
+ typewriterMode: boolean,
+ setTypewriterMode: React.Dispatch>,
+ typewriterInput: string,
+ setTypewriterInput: React.Dispatch>,
+ lockEditorMode: boolean,
+ setLockEditorMode: React.Dispatch>,
+ page: number, /* only for mobile */
+ setPage: React.Dispatch>,
+}>({
+ typewriterMode: true,
+ setTypewriterMode: () => {},
+ typewriterInput: "",
+ setTypewriterInput: () => {},
+ lockEditorMode: false,
+ setLockEditorMode: () => {},
+ page: 0,
+ setPage: () => {}
+});
+
export const InputModeContext = React.createContext<{
typewriterMode: boolean,
setTypewriterMode: React.Dispatch>,
diff --git a/client/src/state/progress.ts b/client/src/state/progress.ts
index c01eca00..617cf250 100644
--- a/client/src/state/progress.ts
+++ b/client/src/state/progress.ts
@@ -19,13 +19,13 @@ interface LevelProgressState {
help: number[], // A set of rows where hidden hints have been displayed
}
interface WorldProgressState {
- [world: string] : {[level: number]: LevelProgressState},
+ [world: string] : {[level: number]: LevelProgressState, readIntro: boolean},
}
export interface GameProgressState {
inventory: string[],
difficulty: number,
- openedIntro: boolean,
+ readIntro: boolean,
data: WorldProgressState,
typewriterMode?: boolean
}
@@ -54,19 +54,24 @@ const initalLevelProgressState: LevelProgressState = {code: "", completed: false
/** Add an empty skeleton with progress for the current game */
function addGameProgress (state: ProgressState, action: PayloadAction<{game: string}>) {
if (!state.games[action.payload.game.toLowerCase()]) {
- state.games[action.payload.game.toLowerCase()] = {inventory: [], openedIntro: true, data: {}, difficulty: DEFAULT_DIFFICULTY}
+ state.games[action.payload.game.toLowerCase()] = {inventory: [], readIntro: false, data: {}, difficulty: DEFAULT_DIFFICULTY}
}
if (!state.games[action.payload.game.toLowerCase()].data) {
state.games[action.payload.game.toLowerCase()].data = {}
}
}
-/** Add an empty skeleton with progress for the current level */
-function addLevelProgress(state: ProgressState, action: PayloadAction<{game: string, world: string, level: number}>) {
+function addWorldProgress(state: ProgressState, action: PayloadAction<{game: string, world: string}>) {
addGameProgress(state, action)
if (!state.games[action.payload.game.toLowerCase()].data[action.payload.world]) {
- state.games[action.payload.game.toLowerCase()].data[action.payload.world] = {}
+ state.games[action.payload.game.toLowerCase()].data[action.payload.world] = {readIntro: false}
}
+}
+
+/** Add an empty skeleton with progress for the current level */
+function addLevelProgress(state: ProgressState, action: PayloadAction<{game: string, world: string, level: number}>) {
+ addGameProgress(state, action)
+ addWorldProgress(state, action)
if (!state.games[action.payload.game.toLowerCase()].data[action.payload.world][action.payload.level]) {
state.games[action.payload.game.toLowerCase()].data[action.payload.world][action.payload.level] = {...initalLevelProgressState}
}
@@ -80,7 +85,7 @@ export const progressSlice = createSlice({
codeEdited(state: ProgressState, action: PayloadAction<{game: string, world: string, level: number, code: string}>) {
addLevelProgress(state, action)
state.games[action.payload.game.toLowerCase()].data[action.payload.world][action.payload.level].code = action.payload.code
- state.games[action.payload.game.toLowerCase()].data[action.payload.world][action.payload.level].completed = false
+ // state.games[action.payload.game.toLowerCase()].data[action.payload.world][action.payload.level].completed = false
},
/** TODO: docstring */
changedSelection(state: ProgressState, action: PayloadAction<{game: string, world: string, level: number, selections: Selection[]}>) {
@@ -100,11 +105,16 @@ export const progressSlice = createSlice({
},
/** delete all progress for this game */
deleteProgress(state: ProgressState, action: PayloadAction<{game: string}>) {
- state.games[action.payload.game.toLowerCase()] = {inventory: [], data: {}, openedIntro: true, difficulty: DEFAULT_DIFFICULTY}
+ state.games[action.payload.game.toLowerCase()] = {inventory: [], data: {}, readIntro: false, difficulty: DEFAULT_DIFFICULTY}
+ },
+ /** delete progress for this world */
+ deleteWorldProgress(state: ProgressState, action: PayloadAction<{game: string, world: string}>) {
+ // addWorldProgress(state, action)
+ state.games[action.payload.game.toLowerCase()].data[action.payload.world] = {readIntro: false}
},
/** delete progress for this level */
deleteLevelProgress(state: ProgressState, action: PayloadAction<{game: string, world: string, level: number}>) {
- addLevelProgress(state, action)
+ // addLevelProgress(state, action)
state.games[action.payload.game.toLowerCase()].data[action.payload.world][action.payload.level] = initalLevelProgressState
},
/** load progress, e.g. from external import */
@@ -123,9 +133,13 @@ export const progressSlice = createSlice({
state.games[action.payload.game.toLowerCase()].difficulty = action.payload.difficulty
},
/** set the difficulty */
- changedOpenedIntro(state: ProgressState, action: PayloadAction<{game: string, openedIntro: boolean}>) {
- addGameProgress(state, action)
- state.games[action.payload.game.toLowerCase()].openedIntro = action.payload.openedIntro
+ changedReadIntro(state: ProgressState, action: PayloadAction<{game: string, world: string, readIntro: boolean}>) {
+ addWorldProgress(state, action)
+ if (action.payload.world) {
+ state.games[action.payload.game.toLowerCase()].data[action.payload.world].readIntro = action.payload.readIntro
+ } else {
+ state.games[action.payload.game.toLowerCase()].readIntro = action.payload.readIntro
+ }
},
/** set the typewriter mode */
changeTypewriterMode(state: ProgressState, action: PayloadAction<{game: string, typewriterMode: boolean}>) {
@@ -137,79 +151,82 @@ export const progressSlice = createSlice({
/** if the level does not exist, return default values */
export function selectLevel(game: string, world: string, level: number) {
- return (state) =>{
- if (!state.progress.games[game.toLowerCase()]) { return initalLevelProgressState }
- if (!state.progress.games[game.toLowerCase()].data[world]) { return initalLevelProgressState }
- if (!state.progress.games[game.toLowerCase()].data[world][level]) { return initalLevelProgressState }
- return state.progress.games[game.toLowerCase()].data[world][level]
+ return (state) => {
+ if (!state.progress.games[game?.toLowerCase()]) { return initalLevelProgressState }
+ if (!state.progress.games[game?.toLowerCase()]?.data[world]) { return initalLevelProgressState }
+ if (!state.progress.games[game?.toLowerCase()]?.data[world][level]) { return initalLevelProgressState }
+ return state.progress.games[game?.toLowerCase()]?.data[world][level]
}
}
/** return the code of the current level */
export function selectCode(game: string, world: string, level: number) {
return (state) => {
- return selectLevel(game.toLowerCase(), world, level)(state).code
+ return selectLevel(game?.toLowerCase(), world, level)(state).code
}
}
/** return the current inventory */
export function selectInventory(game: string) {
return (state) => {
- if (!state.progress.games[game.toLowerCase()]) { return [] }
- return state.progress.games[game.toLowerCase()].inventory
+ if (!state.progress.games[game?.toLowerCase()]) { return [] }
+ return state.progress.games[game?.toLowerCase()]?.inventory
}
}
/** return the code of the current level */
export function selectHelp(game: string, world: string, level: number) {
return (state) => {
- return selectLevel(game.toLowerCase(), world, level)(state).help
+ return selectLevel(game?.toLowerCase(), world, level)(state).help
}
}
/** return the selections made in the current level */
export function selectSelections(game: string, world: string, level: number) {
return (state) => {
- return selectLevel(game.toLowerCase(), world, level)(state).selections
+ return selectLevel(game?.toLowerCase(), world, level)(state).selections
}
}
/** return whether the current level is clompleted */
export function selectCompleted(game: string, world: string, level: number) {
return (state) => {
- return selectLevel(game.toLowerCase(), world, level)(state).completed
+ return selectLevel(game?.toLowerCase(), world, level)(state).completed
}
}
/** return progress for the current game if it exists */
export function selectProgress(game: string) {
return (state) => {
- return state.progress.games[game.toLowerCase()] ?? null
+ return state.progress.games[game?.toLowerCase()] ?? null
}
}
/** return difficulty for the current game if it exists */
export function selectDifficulty(game: string) {
return (state) => {
- return state.progress.games[game.toLowerCase()]?.difficulty ?? DEFAULT_DIFFICULTY
+ return state.progress.games[game?.toLowerCase()]?.difficulty ?? DEFAULT_DIFFICULTY
}
}
/** return whether the intro has been read */
-export function selectOpenedIntro(game: string) {
+export function selectReadIntro(game: string, worldId: string) {
return (state) => {
- return state.progress.games[game.toLowerCase()]?.openedIntro
+ if (worldId) {
+ return state.progress.games[game?.toLowerCase()]?.data[worldId]?.readIntro
+ }
+ return state.progress.games[game?.toLowerCase()]?.readIntro
}
}
/** return typewriter mode for the current game if it exists */
export function selectTypewriterMode(game: string) {
return (state) => {
- return state.progress.games[game.toLowerCase()]?.typewriterMode ?? true
+ return state.progress.games[game?.toLowerCase()]?.typewriterMode ?? true
}
}
/** Export actions to modify the progress */
export const { changedSelection, codeEdited, levelCompleted, deleteProgress,
- deleteLevelProgress, loadProgress, helpEdited, changedInventory, changedOpenedIntro,
+ deleteLevelProgress, deleteWorldProgress, loadProgress, helpEdited, changedInventory, changedReadIntro,
changedDifficulty, changeTypewriterMode} = progressSlice.actions
diff --git a/cypress.config.ts b/cypress.config.ts
new file mode 100644
index 00000000..e385f84d
--- /dev/null
+++ b/cypress.config.ts
@@ -0,0 +1,13 @@
+import { defineConfig } from "cypress";
+
+// default timeout was 4000.
+// Infoview loading is slow on Windows…
+
+export default defineConfig({
+ defaultCommandTimeout: 40000,
+ e2e: {
+ setupNodeEvents(on, config) {
+ // implement node event listeners here
+ },
+ },
+});
diff --git a/cypress/e2e/spec.cy.ts b/cypress/e2e/spec.cy.ts
new file mode 100644
index 00000000..64ed031c
--- /dev/null
+++ b/cypress/e2e/spec.cy.ts
@@ -0,0 +1,85 @@
+describe('The world selection', () => {
+ it('displays the game title', () => {
+ cy.visit('http://localhost:3000/#/g/test/Test')
+ cy.contains('span.nav-title', 'Test Game').should('exist')
+ })
+
+ it('displays the rules popup', () => {
+ cy.visit('http://localhost:3000/#/g/test/Test')
+ cy.contains('a.nav-button', 'Rules').click()
+ cy.contains('div.modal', 'Game Rules').should('exist')
+ })
+
+ it('displays the world titles', () => {
+ cy.visit('http://localhost:3000/#/g/test/Test')
+ cy.get('p.world-title')
+ .map('textContent')
+ .should('have.members', ['Demo World 1', 'Demo World 2']);
+ })
+
+ it('displays the first world and its first level as selectable', () => {
+ cy.visit('http://localhost:3000/#/g/test/Test')
+ cy.contains('svg.world-selection>a:not(.disabled)', 'Demo World 1').as('world').next('a.level').as('level')
+ cy.get('@world')
+ .should('have.attr', 'href', '#/g/test/Test/world/DemoWorld1/level/0')
+ .and('have.css', 'cursor', 'pointer')
+ cy.get('@level')
+ .should('have.attr', 'href', '#/g/test/Test/world/DemoWorld1/level/0')
+ .and('have.css', 'cursor', 'pointer')
+ })
+
+ it('displays the second world and its first level as disabled', () => {
+ cy.visit('http://localhost:3000/#/g/test/Test')
+ cy.contains('svg.world-selection>a.disabled', 'Demo World 2').as('world').next('a.level.disabled').as('level')
+ cy.get('@world')
+ .should('have.attr', 'href', '#/g/test/Test')
+ .and('have.css', 'cursor', 'default')
+ cy.get('@level')
+ .should('have.attr', 'href', '#/g/test/Test')
+ .and('have.css', 'cursor', 'default')
+ })
+})
+
+describe('The first level', () => {
+ it('can be navigated to from the world selection', () => {
+ cy.visit('http://localhost:3000/#/g/test/Test')
+ cy.contains('p.world-title', 'Demo World 1').click()
+ cy.location().its("hash").should('eq', '#/g/test/Test/world/DemoWorld1/level/0')
+ })
+
+ it('displays world and level title', () => {
+ cy.visit('http://localhost:3000/#/g/test/Test/world/DemoWorld1/level/0')
+ cy.contains('div.nav-content', 'Demo World 1')
+ .children()
+ .map((v) => v.textContent.trim())
+ .should('have.members', ['Demo World 1', 'Introduction', 'Start'])
+ })
+
+ it('displays the inventory tabs', () => {
+ cy.visit('http://localhost:3000/#/g/test/Test/world/DemoWorld1/level/0')
+ cy.get('div.tab')
+ .map((v) => v.textContent.trim())
+ .should('have.members', ['Theorems', 'Tactics', 'Definitions'])
+ })
+
+ it('displays the theorems inventory', () => {
+ cy.visit('http://localhost:3000/#/g/test/Test/world/DemoWorld1/level/0')
+ cy.contains('div.tab', 'Theorems').click()
+ cy.contains('div.inventory-list>div.item', 'demo_statement').click()
+ cy.contains('div.documentation>h1', 'demo_statement').should('exist')
+ cy.get('div.documentation>*>svg.fa-xmark').click()
+ })
+
+ it('displays the tactics inventory', () => {
+ cy.visit('http://localhost:3000/#/g/test/Test/world/DemoWorld1/level/0')
+ cy.contains('div.tab', 'Tactics').click()
+ cy.get('div.inventory-list>div.item')
+ .map((v) => v.textContent.trim())
+ .should('have.members', ['exact', 'rfl', 'rw'])
+ cy.contains('div.inventory-list>div.item', 'exact').click()
+ cy.contains('div.documentation>h1', 'exact').should('exist')
+ cy.get('div.documentation>div.markdown')
+ .contains('exact e closes the main goal if its target type matches that of e.')
+ .should('exist')
+ })
+})
\ No newline at end of file
diff --git a/cypress/support/commands.ts b/cypress/support/commands.ts
new file mode 100644
index 00000000..87c1ab6f
--- /dev/null
+++ b/cypress/support/commands.ts
@@ -0,0 +1,65 @@
+///
+
+import 'cypress-iframe';
+
+// ***********************************************
+// This example commands.ts shows you how to
+// create various custom commands and overwrite
+// existing commands.
+//
+// For more comprehensive examples of custom
+// commands please read more here:
+// https://on.cypress.io/custom-commands
+// ***********************************************
+//
+//
+// -- This is a parent command --
+// Cypress.Commands.add('login', (email, password) => { ... })
+//
+//
+// -- This is a child command --
+// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... })
+//
+//
+// -- This is a dual command --
+// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... })
+//
+//
+// -- This will overwrite an existing command --
+// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
+//
+// declare global {
+// namespace Cypress {
+// interface Chainable {
+// login(email: string, password: string): Chainable
+// drag(subject: string, options?: Partial): Chainable
+// dismiss(subject: string, options?: Partial): Chainable
+// visit(originalFn: CommandOriginalFn, url: string, options: Partial): Chainable
+// }
+// }
+// }
+
+type Flatten = T extends Iterable ? Item : never;
+type ArrayIterator = (value: T, index: number, collection: T[]) => TResult;
+
+declare global {
+ namespace Cypress {
+ interface Chainable {
+ map- , K extends keyof Item>(iteratee: K): Chainable
- ;
+ map
- , TResult>(iteratee: ArrayIterator
- ): Chainable
;
+ }
+ }
+}
+
+Cypress.Commands.add('map', { prevSubject: true }, (subject: unknown[], iteratee) => {
+ return cy.wrap(
+ Cypress._.map(subject, iteratee),
+ { log: false }
+ );
+});
+
+Cypress.on('uncaught:exception', (err, runnable) => {
+ // returning false here prevents Cypress from
+ // failing the test
+ return false;
+});
diff --git a/cypress/support/e2e.ts b/cypress/support/e2e.ts
new file mode 100644
index 00000000..f80f74f8
--- /dev/null
+++ b/cypress/support/e2e.ts
@@ -0,0 +1,20 @@
+// ***********************************************************
+// This example support/e2e.ts is processed and
+// loaded automatically before your test files.
+//
+// This is a great place to put global configuration and
+// behavior that modifies Cypress.
+//
+// You can change the location of this file or turn off
+// automatically serving support files with the
+// 'supportFile' configuration option.
+//
+// You can read more here:
+// https://on.cypress.io/configuration
+// ***********************************************************
+
+// Import commands.js using ES2015 syntax:
+import './commands'
+
+// Alternatively you can use CommonJS syntax:
+// require('./commands')
\ No newline at end of file
diff --git a/cypress/tsconfig.json b/cypress/tsconfig.json
new file mode 100644
index 00000000..a9bfdb97
--- /dev/null
+++ b/cypress/tsconfig.json
@@ -0,0 +1,8 @@
+{
+ "compilerOptions": {
+ "target": "es5",
+ "lib": ["es5", "dom"],
+ "types": ["cypress", "node"]
+ },
+ "include": ["**/*.ts"]
+}
\ No newline at end of file
diff --git a/doc/DOCUMENTATION.md b/doc/DOCUMENTATION.md
index ca4a5c20..55244e47 100644
--- a/doc/DOCUMENTATION.md
+++ b/doc/DOCUMENTATION.md
@@ -5,7 +5,7 @@ The server is made out of two parts, named "relay" and "server".
The former, "relay", is the server which
sets up a socket connection to the client, starts the lean servers to work on files and
relays messages between the lean server and the client. `index.mjs` is the file that needs to
-be run, which is done for example using `pm2` or by calling `npm run start_server` or
+be run, which is done for example using `pm2` or by calling `npm run start:server` or
`npm run production`, see more later.
The latter, "server", is the lean server which has two jobs. For one, it produces the "gameserver"
@@ -46,7 +46,7 @@ This way any changes to files in `client/` or `relay/` will cause the server to
Alternative, you can run `npm run build` followed by the commands
```
-npm run start_client
+npm run start:client
npm run production
```
diff --git a/doc/client.md b/doc/client.md
new file mode 100644
index 00000000..bcf1e3d3
--- /dev/null
+++ b/doc/client.md
@@ -0,0 +1,9 @@
+# Client
+
+This document describes features of the frontent/client side.
+
+
+## URL
+
+You can add `?lang=de` at the end of the URL to specify the language that should be set. This
+will change the user's preferred language to the one specified.
diff --git a/doc/create_game.md b/doc/create_game.md
index 857989d0..18556842 100644
--- a/doc/create_game.md
+++ b/doc/create_game.md
@@ -46,6 +46,22 @@ This game has been developed by me.
MakeGame
```
+### Local notations
+
+**Important**: If you use any local notations in your game, you need to open these
+namespaces manually before `MakeGame` in order to see the notation in the inventory.
+
+For example (using mathlib), write
+
+```
+open BigOperators
+
+MakeGame
+```
+
+in order to see `∑ x in s, f x` instead of `Finset.sum s fun x => f x`.
+
+
## 3. Creating a Level
In this tutorial we first learn about Levels. A game consists of a tree of worlds, each world has
diff --git a/doc/hints.md b/doc/hints.md
index 75e95c09..718a51e0 100644
--- a/doc/hints.md
+++ b/doc/hints.md
@@ -100,6 +100,18 @@ For remote images, simply add:
```
+See https://www.jmilne.org/not/Mamscd.pdf
+
+### Images
+
+Hints and introductions/conclusions can also contain images.
+
+For remote images, simply add:
+
+```
+
+```
+
Local images can currently only be included with a hack:
Images in the game's `images/` folder will be accessible at `data/g/[user]/[repo]/[image].[png|jpg|…]` and thus can be included as if they were external images.
diff --git a/doc/npm_scripts.md b/doc/npm_scripts.md
index 389917f1..f4a8ce71 100644
--- a/doc/npm_scripts.md
+++ b/doc/npm_scripts.md
@@ -1,10 +1,10 @@
## NPM Scripts
-* `npm start`: Start the project in development mode. The browser will automatically reload when client files get changed. The Lean server will get recompiled and restarted when lean files get changed. The Lean server will be started without a container. The client and server can be started separately using the scripts `npm run start_client` and `npm run start_server`. The project can be accessed via `http://localhost:3000`.
+* `npm start`: Start the project in development mode. The browser will automatically reload when client files get changed. The Lean server will get recompiled and restarted when lean files get changed. The Lean server will be started without a container. The client and server can be started separately using the scripts `npm run start:client` and `npm run start:server`. The project can be accessed via `http://localhost:3000`.
Internally, websocket requests to `ws://localhost:3000/websockets` will be forwarded to a Lean server running on port `8080`.
* `npm run build`: Build the project in production mode. All assets of the client will be compiled into `client/dist`.
-On the server side, the command will set up a docker image containing the Lean server. The two parts can be built separately using `npm run build_client` and `npm run build_server`.
+On the server side, the command will set up a docker image containing the Lean server. The two parts can be built separately using `npm run build:client` and `npm run build:server`.
* `npm run production`: Start the project in production mode. This requires that the build script has been run. It will start a server on the port specified in the `PORT` environment variable or by default on `8080`. You can run on a specific port by running `PORT=80 npm run production`. The server will serve the files in `client/dist` via http and give access to the bubblewrapped Lean server via the web socket protocol.
diff --git a/doc/publish_game.md b/doc/publish_game.md
index e720bf4e..57449993 100644
--- a/doc/publish_game.md
+++ b/doc/publish_game.md
@@ -33,4 +33,4 @@ To upload a new version of the game you will have to repeat 1. and 2. whenever y
Adding games to the main page happens manually by the server maintainers. Tell us if you want us
to add a tile for your game!
-For example, you can [contact Jon on Zulip](https://leanprover.zulipchat.com/#narrow/dm/385895-Jon-Eugster). Or [via Email](https://www.math.hhu.de/en/lehrstuehle-/-personen-/-ansprechpartner/innen/lehrstuehle-des-mathematischen-instituts/lehrstuhl-fuer-algebraische-geometrie/team/jon-eugster).
+For example, you can [contact Jon on Zulip](https://leanprover.zulipchat.com/#narrow/dm/385895-Jon-Eugster).
diff --git a/doc/running_locally.md b/doc/running_locally.md
index 2a044fd5..0796193c 100644
--- a/doc/running_locally.md
+++ b/doc/running_locally.md
@@ -102,11 +102,11 @@ npm start
You should see a message like this:
```bash
-[server] > lean4-game@0.1.0 start_server
+[server] > lean4-game@0.1.0 start:server
[server] > (cd server && lake build) && (cd relay && cross-env NODE_ENV=development nodemon -e mjs --exec "node ./index.mjs")
[server]
[client]
-[client] > lean4-game@0.1.0 start_client
+[client] > lean4-game@0.1.0 start:client
[client] > cross-env NODE_ENV=development vite --host
[client]
[server] [nodemon] 3.0.#
diff --git a/doc/troubleshoot.md b/doc/troubleshoot.md
index 1320b2ee..dc8d10ad 100644
--- a/doc/troubleshoot.md
+++ b/doc/troubleshoot.md
@@ -27,7 +27,7 @@ Here are known issues/pitfalls with the local setup using `npm`.
* If `CDPATH` is set on your mac/linux system, it might provide issues with `npm start` resulting in a server crash or blank screen. In particular `npm start` will display
```
[server] sh: line 0: cd: server: No such file or directory
- [server] npm run start_server exited with code 1
+ [server] npm run start:server exited with code 1
```
As a fix you might need to delete your manually set `CDPATH` environment variable.
diff --git a/doc/writing_exercises.md b/doc/writing_exercises.md
index c2a04fb5..b91177e2 100644
--- a/doc/writing_exercises.md
+++ b/doc/writing_exercises.md
@@ -54,11 +54,11 @@ only evaluated at the beginning of the proof.
## Attributes
-You can add attributes as you would for a `theorem`. Most notably, you can make your named exercise a `simp` lemma:
+You can add attributes as you would for a `theorem`. Most notably, you can make your named exercise a `simp` theorem:
```lean
@[simp]
-Statement my_simp_lemma ...
+Statement my_simp_theorem ...
```
## Formatting
diff --git a/index.html b/index.html
index 67415036..4c05b6e2 100644
--- a/index.html
+++ b/index.html
@@ -5,11 +5,6 @@
Lean Game Server
-
@@ -23,13 +18,19 @@ Lean Game Server
Impressum:
- Jon Eugster
+ Marcus Zibrowius, Jon Eugster
Mathematisches Institut der Heinrich-Heine-Universität Düsseldorf
Universitätsstr. 1
40225 Düsseldorf
Germany
- +49 211 81-12173
- Contact Details
+ +49 211 81-14690
+ Contact Details
+
+
+ Datenschutzerklärung:
+ Without JavaScript this website cannot be used and therefore no personal data is collected
+ or stored.
+ Our Server is located in Germany.
diff --git a/package-lock.json b/package-lock.json
index 8056c757..353aed45 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -11,13 +11,13 @@
"@babel/plugin-transform-optional-chaining": "^7.23.0",
"@emotion/react": "^11.10.5",
"@emotion/styled": "^11.10.5",
+ "@floating-ui/react": "^0.27.4",
"@fontsource/roboto": "^4.5.8",
"@fontsource/roboto-mono": "^4.5.8",
"@fortawesome/fontawesome-svg-core": "^6.5.1",
"@fortawesome/free-regular-svg-icons": "^6.5.1",
"@fortawesome/free-solid-svg-icons": "^6.5.1",
"@fortawesome/react-fontawesome": "^0.2.0",
- "@leanprover/infoview": "^0.4.3",
"@mui/icons-material": "^5.11.0",
"@mui/material": "^5.11.1",
"@reduxjs/toolkit": "^1.9.1",
@@ -25,6 +25,7 @@
"@types/got": "^9.6.12",
"@types/react-router-dom": "^5.3.3",
"@vitejs/plugin-react-swc": "^3.4.0",
+ "@vscode/webview-ui-toolkit": "^1.4.0",
"cross-env": "^7.0.3",
"cytoscape": "^3.23.0",
"cytoscape-elk": "^2.1.0",
@@ -32,26 +33,37 @@
"debounce": "^1.2.1",
"express": "^4.18.2",
"got": "^14.4.6",
+ "highlightjs-lean": "^1.2.0",
"i18next": "^23.10.1",
"i18next-http-backend": "^2.5.0",
"i18next-scanner-typescript": "^1.2.0",
+ "ip-anonymize": "^0.1.0",
"lean4-infoview": "https://gitpkg.now.sh/leanprover/vscode-lean4/lean4-infoview?de0062c",
+ "lean4monaco": "^1.0.46",
"lean4web": "github:hhu-adam/lean4web#414d9e62638a392fca278761b4c61a1d2e138bc7",
+ "marked": "^4.3.0",
+ "memfs": "^4.11.1",
"node-schedule": "^2.1.1",
"octokit": "^4.1.2",
"path-browserify": "^1.0.1",
- "react": "^18.2.0",
+ "react-contenteditable": "^3.3.7",
"react-country-flag": "^3.1.0",
"react-dom": "^18.2.0",
"react-i18next": "^14.1.0",
"react-markdown": "^8.0.4",
- "react-native": "^0.72.3",
+ "react-popper": "^2.3.0",
"react-redux": "^8.0.5",
"react-router-dom": "^6.5.0",
"react-split": "^2.0.14",
+ "react-syntax-highlighter": "^15.6.1",
"rehype-katex": "^6.0.2",
+ "rehype-mathjax": "^7.1.0",
+ "rehype-raw": "^7.0.0",
"remark-gfm": "^3.0.1",
"remark-math": "^5.1.1",
+ "request": "^2.88.2",
+ "request-progress": "^3.0.0",
+ "rollup": "^4.34.9",
"uuid": "^11.1.0",
"vite": "^6.2.0",
"vite-plugin-static-copy": "2.3.0",
@@ -61,6 +73,7 @@
"ws": "^8.18.1"
},
"devDependencies": {
+ "@codingame/esbuild-import-meta-url-plugin": "https://gitpkg.vercel.app/hhu-adam/lean4monaco/esbuild-import-meta-url-plugin?main",
"@pmmmwh/react-refresh-webpack-plugin": "^0.5.10",
"@redux-devtools/core": "^3.13.1",
"@testing-library/react": "^13.4.0",
@@ -69,20 +82,25 @@
"@types/ws": "^8.18.1",
"concurrently": "^7.6.0",
"css-loader": "^6.7.3",
+ "cypress": "^13.17.0",
+ "cypress-iframe": "^1.0.1",
"file-loader": "^6.2.0",
"i18next-scanner": "^4.4.0",
"nodemon": "^3.0.1",
"react-refresh": "^0.14.0",
"style-loader": "^3.3.1",
"ts-loader": "^9.4.2",
- "typescript": "^4.9.4",
- "url-loader": "^4.1.1"
+ "url-loader": "^4.1.1",
+ "vite": "^6.1.1",
+ "vite-plugin-node-polyfills": "^0.23.0",
+ "vite-plugin-static-copy": "^2.2.0",
+ "vite-plugin-svgr": "^4.3.0",
+ "wait-on": "^8.0.2"
}
},
"node_modules/@ampproject/remapping": {
"version": "2.2.1",
- "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz",
- "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==",
+ "license": "Apache-2.0",
"dependencies": {
"@jridgewell/gen-mapping": "^0.3.0",
"@jridgewell/trace-mapping": "^0.3.9"
@@ -93,8 +111,6 @@
},
"node_modules/@babel/code-frame": {
"version": "7.26.2",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz",
- "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==",
"license": "MIT",
"dependencies": {
"@babel/helper-validator-identifier": "^7.25.9",
@@ -107,16 +123,14 @@
},
"node_modules/@babel/compat-data": {
"version": "7.23.5",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz",
- "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==",
+ "license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/core": {
"version": "7.23.9",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz",
- "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==",
+ "license": "MIT",
"dependencies": {
"@ampproject/remapping": "^2.2.0",
"@babel/code-frame": "^7.23.5",
@@ -144,8 +158,6 @@
},
"node_modules/@babel/generator": {
"version": "7.25.7",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.7.tgz",
- "integrity": "sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==",
"license": "MIT",
"dependencies": {
"@babel/types": "^7.25.7",
@@ -159,9 +171,9 @@
},
"node_modules/@babel/helper-annotate-as-pure": {
"version": "7.25.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.7.tgz",
- "integrity": "sha512-4xwU8StnqnlIhhioZf1tqnVWeQ9pvH/ujS8hRfw/WOza+/a+1qv69BWNy+oY231maTCWgKWhfBU7kDpsds6zAA==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/types": "^7.25.7"
},
@@ -171,8 +183,8 @@
},
"node_modules/@babel/helper-builder-binary-assignment-operator-visitor": {
"version": "7.22.15",
- "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz",
- "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==",
+ "license": "MIT",
+ "optional": true,
"peer": true,
"dependencies": {
"@babel/types": "^7.22.15"
@@ -183,8 +195,7 @@
},
"node_modules/@babel/helper-compilation-targets": {
"version": "7.23.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz",
- "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==",
+ "license": "MIT",
"dependencies": {
"@babel/compat-data": "^7.23.5",
"@babel/helper-validator-option": "^7.23.5",
@@ -198,8 +209,9 @@
},
"node_modules/@babel/helper-create-class-features-plugin": {
"version": "7.23.10",
- "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.10.tgz",
- "integrity": "sha512-2XpP2XhkXzgxecPNEEK8Vz8Asj9aRxt08oKOqtiZoqV2UGZ5T+EkyP9sXQ9nwMxBIG34a7jmasVqoMop7VdPUw==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/helper-annotate-as-pure": "^7.22.5",
"@babel/helper-environment-visitor": "^7.22.20",
@@ -220,8 +232,9 @@
},
"node_modules/@babel/helper-create-regexp-features-plugin": {
"version": "7.22.15",
- "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz",
- "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/helper-annotate-as-pure": "^7.22.5",
"regexpu-core": "^5.3.1",
@@ -236,8 +249,8 @@
},
"node_modules/@babel/helper-define-polyfill-provider": {
"version": "0.5.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz",
- "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==",
+ "license": "MIT",
+ "optional": true,
"peer": true,
"dependencies": {
"@babel/helper-compilation-targets": "^7.22.6",
@@ -252,16 +265,16 @@
},
"node_modules/@babel/helper-environment-visitor": {
"version": "7.22.20",
- "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz",
- "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==",
+ "license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-function-name": {
"version": "7.23.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz",
- "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/template": "^7.22.15",
"@babel/types": "^7.23.0"
@@ -272,8 +285,8 @@
},
"node_modules/@babel/helper-hoist-variables": {
"version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz",
- "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==",
+ "license": "MIT",
+ "optional": true,
"peer": true,
"dependencies": {
"@babel/types": "^7.22.5"
@@ -284,8 +297,9 @@
},
"node_modules/@babel/helper-member-expression-to-functions": {
"version": "7.23.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz",
- "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/types": "^7.23.0"
},
@@ -295,8 +309,6 @@
},
"node_modules/@babel/helper-module-imports": {
"version": "7.25.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.7.tgz",
- "integrity": "sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==",
"license": "MIT",
"dependencies": {
"@babel/traverse": "^7.25.7",
@@ -308,8 +320,7 @@
},
"node_modules/@babel/helper-module-transforms": {
"version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz",
- "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==",
+ "license": "MIT",
"dependencies": {
"@babel/helper-environment-visitor": "^7.22.20",
"@babel/helper-module-imports": "^7.22.15",
@@ -326,8 +337,9 @@
},
"node_modules/@babel/helper-optimise-call-expression": {
"version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz",
- "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/types": "^7.22.5"
},
@@ -337,8 +349,6 @@
},
"node_modules/@babel/helper-plugin-utils": {
"version": "7.25.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.7.tgz",
- "integrity": "sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw==",
"license": "MIT",
"engines": {
"node": ">=6.9.0"
@@ -346,8 +356,9 @@
},
"node_modules/@babel/helper-remap-async-to-generator": {
"version": "7.22.20",
- "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz",
- "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/helper-annotate-as-pure": "^7.22.5",
"@babel/helper-environment-visitor": "^7.22.20",
@@ -362,8 +373,9 @@
},
"node_modules/@babel/helper-replace-supers": {
"version": "7.22.20",
- "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz",
- "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/helper-environment-visitor": "^7.22.20",
"@babel/helper-member-expression-to-functions": "^7.22.15",
@@ -378,8 +390,7 @@
},
"node_modules/@babel/helper-simple-access": {
"version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz",
- "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==",
+ "license": "MIT",
"dependencies": {
"@babel/types": "^7.22.5"
},
@@ -389,8 +400,7 @@
},
"node_modules/@babel/helper-skip-transparent-expression-wrappers": {
"version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz",
- "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==",
+ "license": "MIT",
"dependencies": {
"@babel/types": "^7.22.5"
},
@@ -400,8 +410,7 @@
},
"node_modules/@babel/helper-split-export-declaration": {
"version": "7.22.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz",
- "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==",
+ "license": "MIT",
"dependencies": {
"@babel/types": "^7.22.5"
},
@@ -411,8 +420,6 @@
},
"node_modules/@babel/helper-string-parser": {
"version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz",
- "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==",
"license": "MIT",
"engines": {
"node": ">=6.9.0"
@@ -420,8 +427,6 @@
},
"node_modules/@babel/helper-validator-identifier": {
"version": "7.25.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
- "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
"license": "MIT",
"engines": {
"node": ">=6.9.0"
@@ -429,16 +434,16 @@
},
"node_modules/@babel/helper-validator-option": {
"version": "7.23.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz",
- "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==",
+ "license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-wrap-function": {
"version": "7.22.20",
- "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz",
- "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/helper-function-name": "^7.22.5",
"@babel/template": "^7.22.15",
@@ -450,8 +455,6 @@
},
"node_modules/@babel/helpers": {
"version": "7.26.10",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.10.tgz",
- "integrity": "sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g==",
"license": "MIT",
"dependencies": {
"@babel/template": "^7.26.9",
@@ -463,8 +466,6 @@
},
"node_modules/@babel/parser": {
"version": "7.26.10",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.10.tgz",
- "integrity": "sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==",
"license": "MIT",
"dependencies": {
"@babel/types": "^7.26.10"
@@ -478,8 +479,8 @@
},
"node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
"version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz",
- "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==",
+ "license": "MIT",
+ "optional": true,
"peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5"
@@ -493,8 +494,8 @@
},
"node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
"version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz",
- "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==",
+ "license": "MIT",
+ "optional": true,
"peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5",
@@ -510,8 +511,8 @@
},
"node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": {
"version": "7.23.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.7.tgz",
- "integrity": "sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==",
+ "license": "MIT",
+ "optional": true,
"peer": true,
"dependencies": {
"@babel/helper-environment-visitor": "^7.22.20",
@@ -526,10 +527,9 @@
},
"node_modules/@babel/plugin-proposal-async-generator-functions": {
"version": "7.20.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz",
- "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==",
- "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-async-generator-functions instead.",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/helper-environment-visitor": "^7.18.9",
"@babel/helper-plugin-utils": "^7.20.2",
@@ -545,9 +545,9 @@
},
"node_modules/@babel/plugin-proposal-class-properties": {
"version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz",
- "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==",
- "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/helper-create-class-features-plugin": "^7.18.6",
"@babel/helper-plugin-utils": "^7.18.6"
@@ -561,9 +561,9 @@
},
"node_modules/@babel/plugin-proposal-export-default-from": {
"version": "7.25.8",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.25.8.tgz",
- "integrity": "sha512-5SLPHA/Gk7lNdaymtSVS9jH77Cs7yuHTR3dYj+9q+M7R7tNLXhNuvnmOfafRIzpWL+dtMibuu1I4ofrc768Gkw==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.25.7"
},
@@ -576,9 +576,9 @@
},
"node_modules/@babel/plugin-proposal-nullish-coalescing-operator": {
"version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz",
- "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==",
- "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.18.6",
"@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
@@ -592,10 +592,9 @@
},
"node_modules/@babel/plugin-proposal-numeric-separator": {
"version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz",
- "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==",
- "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead.",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.18.6",
"@babel/plugin-syntax-numeric-separator": "^7.10.4"
@@ -609,10 +608,9 @@
},
"node_modules/@babel/plugin-proposal-object-rest-spread": {
"version": "7.20.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz",
- "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==",
- "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead.",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/compat-data": "^7.20.5",
"@babel/helper-compilation-targets": "^7.20.7",
@@ -629,10 +627,9 @@
},
"node_modules/@babel/plugin-proposal-optional-catch-binding": {
"version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz",
- "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==",
- "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-catch-binding instead.",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.18.6",
"@babel/plugin-syntax-optional-catch-binding": "^7.8.3"
@@ -646,9 +643,9 @@
},
"node_modules/@babel/plugin-proposal-optional-chaining": {
"version": "7.21.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz",
- "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==",
- "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.20.2",
"@babel/helper-skip-transparent-expression-wrappers": "^7.20.0",
@@ -663,8 +660,8 @@
},
"node_modules/@babel/plugin-proposal-private-property-in-object": {
"version": "7.21.0-placeholder-for-preset-env.2",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz",
- "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==",
+ "license": "MIT",
+ "optional": true,
"peer": true,
"engines": {
"node": ">=6.9.0"
@@ -675,8 +672,9 @@
},
"node_modules/@babel/plugin-syntax-async-generators": {
"version": "7.8.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
- "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.8.0"
},
@@ -686,8 +684,9 @@
},
"node_modules/@babel/plugin-syntax-class-properties": {
"version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
- "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.12.13"
},
@@ -697,8 +696,8 @@
},
"node_modules/@babel/plugin-syntax-class-static-block": {
"version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz",
- "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==",
+ "license": "MIT",
+ "optional": true,
"peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.14.5"
@@ -712,8 +711,9 @@
},
"node_modules/@babel/plugin-syntax-dynamic-import": {
"version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz",
- "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.8.0"
},
@@ -723,9 +723,9 @@
},
"node_modules/@babel/plugin-syntax-export-default-from": {
"version": "7.25.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.25.7.tgz",
- "integrity": "sha512-LRUCsC0YucSjabsmxx6yly8+Q/5mxKdp9gemlpR9ro3bfpcOQOXx/CHivs7QCbjgygd6uQ2GcRfHu1FVax/hgg==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.25.7"
},
@@ -738,8 +738,8 @@
},
"node_modules/@babel/plugin-syntax-export-namespace-from": {
"version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz",
- "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==",
+ "license": "MIT",
+ "optional": true,
"peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.8.3"
@@ -750,8 +750,9 @@
},
"node_modules/@babel/plugin-syntax-flow": {
"version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.23.3.tgz",
- "integrity": "sha512-YZiAIpkJAwQXBJLIQbRFayR5c+gJ35Vcz3bg954k7cd73zqjvhacJuL9RbrzPz8qPmZdgqP6EUKwy0PCNhaaPA==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5"
},
@@ -764,8 +765,8 @@
},
"node_modules/@babel/plugin-syntax-import-assertions": {
"version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz",
- "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==",
+ "license": "MIT",
+ "optional": true,
"peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5"
@@ -779,8 +780,8 @@
},
"node_modules/@babel/plugin-syntax-import-attributes": {
"version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz",
- "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==",
+ "license": "MIT",
+ "optional": true,
"peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5"
@@ -794,8 +795,8 @@
},
"node_modules/@babel/plugin-syntax-import-meta": {
"version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
- "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
+ "license": "MIT",
+ "optional": true,
"peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.10.4"
@@ -806,8 +807,8 @@
},
"node_modules/@babel/plugin-syntax-json-strings": {
"version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
- "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
+ "license": "MIT",
+ "optional": true,
"peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.8.0"
@@ -818,9 +819,9 @@
},
"node_modules/@babel/plugin-syntax-jsx": {
"version": "7.25.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.7.tgz",
- "integrity": "sha512-ruZOnKO+ajVL/MVx+PwNBPOkrnXTXoWMtte1MBpegfCArhqOe3Bj52avVj1huLLxNKYKXYaSxZ2F+woK1ekXfw==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.25.7"
},
@@ -833,8 +834,8 @@
},
"node_modules/@babel/plugin-syntax-logical-assignment-operators": {
"version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
- "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
+ "license": "MIT",
+ "optional": true,
"peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.10.4"
@@ -845,8 +846,9 @@
},
"node_modules/@babel/plugin-syntax-nullish-coalescing-operator": {
"version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
- "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.8.0"
},
@@ -856,8 +858,9 @@
},
"node_modules/@babel/plugin-syntax-numeric-separator": {
"version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
- "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.10.4"
},
@@ -867,8 +870,9 @@
},
"node_modules/@babel/plugin-syntax-object-rest-spread": {
"version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
- "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.8.0"
},
@@ -878,8 +882,9 @@
},
"node_modules/@babel/plugin-syntax-optional-catch-binding": {
"version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
- "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.8.0"
},
@@ -889,8 +894,7 @@
},
"node_modules/@babel/plugin-syntax-optional-chaining": {
"version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
- "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
+ "license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.8.0"
},
@@ -900,8 +904,8 @@
},
"node_modules/@babel/plugin-syntax-private-property-in-object": {
"version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz",
- "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==",
+ "license": "MIT",
+ "optional": true,
"peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.14.5"
@@ -915,8 +919,8 @@
},
"node_modules/@babel/plugin-syntax-top-level-await": {
"version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz",
- "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==",
+ "license": "MIT",
+ "optional": true,
"peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.14.5"
@@ -930,8 +934,9 @@
},
"node_modules/@babel/plugin-syntax-typescript": {
"version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz",
- "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5"
},
@@ -944,8 +949,8 @@
},
"node_modules/@babel/plugin-syntax-unicode-sets-regex": {
"version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz",
- "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==",
+ "license": "MIT",
+ "optional": true,
"peer": true,
"dependencies": {
"@babel/helper-create-regexp-features-plugin": "^7.18.6",
@@ -960,8 +965,9 @@
},
"node_modules/@babel/plugin-transform-arrow-functions": {
"version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz",
- "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5"
},
@@ -974,8 +980,8 @@
},
"node_modules/@babel/plugin-transform-async-generator-functions": {
"version": "7.23.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.9.tgz",
- "integrity": "sha512-8Q3veQEDGe14dTYuwagbRtwxQDnytyg1JFu4/HwEMETeofocrB0U0ejBJIXoeG/t2oXZ8kzCyI0ZZfbT80VFNQ==",
+ "license": "MIT",
+ "optional": true,
"peer": true,
"dependencies": {
"@babel/helper-environment-visitor": "^7.22.20",
@@ -992,8 +998,9 @@
},
"node_modules/@babel/plugin-transform-async-to-generator": {
"version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz",
- "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/helper-module-imports": "^7.22.15",
"@babel/helper-plugin-utils": "^7.22.5",
@@ -1008,8 +1015,9 @@
},
"node_modules/@babel/plugin-transform-block-scoped-functions": {
"version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz",
- "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5"
},
@@ -1022,8 +1030,9 @@
},
"node_modules/@babel/plugin-transform-block-scoping": {
"version": "7.23.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz",
- "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5"
},
@@ -1036,8 +1045,8 @@
},
"node_modules/@babel/plugin-transform-class-properties": {
"version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz",
- "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==",
+ "license": "MIT",
+ "optional": true,
"peer": true,
"dependencies": {
"@babel/helper-create-class-features-plugin": "^7.22.15",
@@ -1052,8 +1061,8 @@
},
"node_modules/@babel/plugin-transform-class-static-block": {
"version": "7.23.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz",
- "integrity": "sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==",
+ "license": "MIT",
+ "optional": true,
"peer": true,
"dependencies": {
"@babel/helper-create-class-features-plugin": "^7.22.15",
@@ -1069,8 +1078,9 @@
},
"node_modules/@babel/plugin-transform-classes": {
"version": "7.23.8",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz",
- "integrity": "sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/helper-annotate-as-pure": "^7.22.5",
"@babel/helper-compilation-targets": "^7.23.6",
@@ -1090,8 +1100,9 @@
},
"node_modules/@babel/plugin-transform-computed-properties": {
"version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz",
- "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5",
"@babel/template": "^7.22.15"
@@ -1105,8 +1116,9 @@
},
"node_modules/@babel/plugin-transform-destructuring": {
"version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz",
- "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5"
},
@@ -1119,8 +1131,8 @@
},
"node_modules/@babel/plugin-transform-dotall-regex": {
"version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz",
- "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==",
+ "license": "MIT",
+ "optional": true,
"peer": true,
"dependencies": {
"@babel/helper-create-regexp-features-plugin": "^7.22.15",
@@ -1135,8 +1147,8 @@
},
"node_modules/@babel/plugin-transform-duplicate-keys": {
"version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz",
- "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==",
+ "license": "MIT",
+ "optional": true,
"peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5"
@@ -1150,8 +1162,8 @@
},
"node_modules/@babel/plugin-transform-dynamic-import": {
"version": "7.23.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz",
- "integrity": "sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==",
+ "license": "MIT",
+ "optional": true,
"peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5",
@@ -1166,8 +1178,8 @@
},
"node_modules/@babel/plugin-transform-exponentiation-operator": {
"version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz",
- "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==",
+ "license": "MIT",
+ "optional": true,
"peer": true,
"dependencies": {
"@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15",
@@ -1182,8 +1194,8 @@
},
"node_modules/@babel/plugin-transform-export-namespace-from": {
"version": "7.23.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz",
- "integrity": "sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==",
+ "license": "MIT",
+ "optional": true,
"peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5",
@@ -1198,8 +1210,9 @@
},
"node_modules/@babel/plugin-transform-flow-strip-types": {
"version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.23.3.tgz",
- "integrity": "sha512-26/pQTf9nQSNVJCrLB1IkHUKyPxR+lMrH2QDPG89+Znu9rAMbtrybdbWeE9bb7gzjmE5iXHEY+e0HUwM6Co93Q==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5",
"@babel/plugin-syntax-flow": "^7.23.3"
@@ -1213,8 +1226,9 @@
},
"node_modules/@babel/plugin-transform-for-of": {
"version": "7.23.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz",
- "integrity": "sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5",
"@babel/helper-skip-transparent-expression-wrappers": "^7.22.5"
@@ -1228,8 +1242,9 @@
},
"node_modules/@babel/plugin-transform-function-name": {
"version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz",
- "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/helper-compilation-targets": "^7.22.15",
"@babel/helper-function-name": "^7.23.0",
@@ -1244,8 +1259,8 @@
},
"node_modules/@babel/plugin-transform-json-strings": {
"version": "7.23.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz",
- "integrity": "sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==",
+ "license": "MIT",
+ "optional": true,
"peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5",
@@ -1260,8 +1275,9 @@
},
"node_modules/@babel/plugin-transform-literals": {
"version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz",
- "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5"
},
@@ -1274,8 +1290,8 @@
},
"node_modules/@babel/plugin-transform-logical-assignment-operators": {
"version": "7.23.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz",
- "integrity": "sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==",
+ "license": "MIT",
+ "optional": true,
"peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5",
@@ -1290,8 +1306,9 @@
},
"node_modules/@babel/plugin-transform-member-expression-literals": {
"version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz",
- "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5"
},
@@ -1304,8 +1321,8 @@
},
"node_modules/@babel/plugin-transform-modules-amd": {
"version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz",
- "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==",
+ "license": "MIT",
+ "optional": true,
"peer": true,
"dependencies": {
"@babel/helper-module-transforms": "^7.23.3",
@@ -1320,8 +1337,9 @@
},
"node_modules/@babel/plugin-transform-modules-commonjs": {
"version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz",
- "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/helper-module-transforms": "^7.23.3",
"@babel/helper-plugin-utils": "^7.22.5",
@@ -1336,8 +1354,8 @@
},
"node_modules/@babel/plugin-transform-modules-systemjs": {
"version": "7.23.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.9.tgz",
- "integrity": "sha512-KDlPRM6sLo4o1FkiSlXoAa8edLXFsKKIda779fbLrvmeuc3itnjCtaO6RrtoaANsIJANj+Vk1zqbZIMhkCAHVw==",
+ "license": "MIT",
+ "optional": true,
"peer": true,
"dependencies": {
"@babel/helper-hoist-variables": "^7.22.5",
@@ -1354,8 +1372,8 @@
},
"node_modules/@babel/plugin-transform-modules-umd": {
"version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz",
- "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==",
+ "license": "MIT",
+ "optional": true,
"peer": true,
"dependencies": {
"@babel/helper-module-transforms": "^7.23.3",
@@ -1370,8 +1388,9 @@
},
"node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
"version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz",
- "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/helper-create-regexp-features-plugin": "^7.22.5",
"@babel/helper-plugin-utils": "^7.22.5"
@@ -1385,8 +1404,8 @@
},
"node_modules/@babel/plugin-transform-new-target": {
"version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz",
- "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==",
+ "license": "MIT",
+ "optional": true,
"peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5"
@@ -1400,8 +1419,8 @@
},
"node_modules/@babel/plugin-transform-nullish-coalescing-operator": {
"version": "7.23.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz",
- "integrity": "sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==",
+ "license": "MIT",
+ "optional": true,
"peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5",
@@ -1416,8 +1435,8 @@
},
"node_modules/@babel/plugin-transform-numeric-separator": {
"version": "7.23.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz",
- "integrity": "sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==",
+ "license": "MIT",
+ "optional": true,
"peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5",
@@ -1432,8 +1451,8 @@
},
"node_modules/@babel/plugin-transform-object-rest-spread": {
"version": "7.23.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz",
- "integrity": "sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==",
+ "license": "MIT",
+ "optional": true,
"peer": true,
"dependencies": {
"@babel/compat-data": "^7.23.3",
@@ -1451,8 +1470,9 @@
},
"node_modules/@babel/plugin-transform-object-super": {
"version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz",
- "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5",
"@babel/helper-replace-supers": "^7.22.20"
@@ -1466,8 +1486,8 @@
},
"node_modules/@babel/plugin-transform-optional-catch-binding": {
"version": "7.23.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz",
- "integrity": "sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==",
+ "license": "MIT",
+ "optional": true,
"peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5",
@@ -1482,8 +1502,7 @@
},
"node_modules/@babel/plugin-transform-optional-chaining": {
"version": "7.23.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz",
- "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==",
+ "license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5",
"@babel/helper-skip-transparent-expression-wrappers": "^7.22.5",
@@ -1498,8 +1517,9 @@
},
"node_modules/@babel/plugin-transform-parameters": {
"version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz",
- "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5"
},
@@ -1512,8 +1532,8 @@
},
"node_modules/@babel/plugin-transform-private-methods": {
"version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz",
- "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==",
+ "license": "MIT",
+ "optional": true,
"peer": true,
"dependencies": {
"@babel/helper-create-class-features-plugin": "^7.22.15",
@@ -1528,8 +1548,8 @@
},
"node_modules/@babel/plugin-transform-private-property-in-object": {
"version": "7.23.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz",
- "integrity": "sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==",
+ "license": "MIT",
+ "optional": true,
"peer": true,
"dependencies": {
"@babel/helper-annotate-as-pure": "^7.22.5",
@@ -1546,8 +1566,9 @@
},
"node_modules/@babel/plugin-transform-property-literals": {
"version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz",
- "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5"
},
@@ -1560,9 +1581,9 @@
},
"node_modules/@babel/plugin-transform-react-display-name": {
"version": "7.25.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.25.7.tgz",
- "integrity": "sha512-r0QY7NVU8OnrwE+w2IWiRom0wwsTbjx4+xH2RTd7AVdof3uurXOF+/mXHQDRk+2jIvWgSaCHKMgggfvM4dyUGA==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.25.7"
},
@@ -1575,9 +1596,9 @@
},
"node_modules/@babel/plugin-transform-react-jsx": {
"version": "7.25.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.7.tgz",
- "integrity": "sha512-vILAg5nwGlR9EXE8JIOX4NHXd49lrYbN8hnjffDtoULwpL9hUx/N55nqh2qd0q6FyNDfjl9V79ecKGvFbcSA0Q==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/helper-annotate-as-pure": "^7.25.7",
"@babel/helper-module-imports": "^7.25.7",
@@ -1594,9 +1615,9 @@
},
"node_modules/@babel/plugin-transform-react-jsx-self": {
"version": "7.25.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.7.tgz",
- "integrity": "sha512-JD9MUnLbPL0WdVK8AWC7F7tTG2OS6u/AKKnsK+NdRhUiVdnzyR1S3kKQCaRLOiaULvUiqK6Z4JQE635VgtCFeg==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.25.7"
},
@@ -1609,9 +1630,9 @@
},
"node_modules/@babel/plugin-transform-react-jsx-source": {
"version": "7.25.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.7.tgz",
- "integrity": "sha512-S/JXG/KrbIY06iyJPKfxr0qRxnhNOdkNXYBl/rmwgDd72cQLH9tEGkDm/yJPGvcSIUoikzfjMios9i+xT/uv9w==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.25.7"
},
@@ -1624,8 +1645,8 @@
},
"node_modules/@babel/plugin-transform-regenerator": {
"version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz",
- "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==",
+ "license": "MIT",
+ "optional": true,
"peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5",
@@ -1640,8 +1661,8 @@
},
"node_modules/@babel/plugin-transform-reserved-words": {
"version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz",
- "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==",
+ "license": "MIT",
+ "optional": true,
"peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5"
@@ -1655,9 +1676,9 @@
},
"node_modules/@babel/plugin-transform-runtime": {
"version": "7.25.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.7.tgz",
- "integrity": "sha512-Y9p487tyTzB0yDYQOtWnC+9HGOuogtP3/wNpun1xJXEEvI6vip59BSBTsHnekZLqxmPcgsrAKt46HAAb//xGhg==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/helper-module-imports": "^7.25.7",
"@babel/helper-plugin-utils": "^7.25.7",
@@ -1675,9 +1696,9 @@
},
"node_modules/@babel/plugin-transform-runtime/node_modules/@babel/helper-define-polyfill-provider": {
"version": "0.6.2",
- "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz",
- "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/helper-compilation-targets": "^7.22.6",
"@babel/helper-plugin-utils": "^7.22.5",
@@ -1691,9 +1712,9 @@
},
"node_modules/@babel/plugin-transform-runtime/node_modules/babel-plugin-polyfill-corejs3": {
"version": "0.10.6",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz",
- "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/helper-define-polyfill-provider": "^0.6.2",
"core-js-compat": "^3.38.0"
@@ -1704,9 +1725,9 @@
},
"node_modules/@babel/plugin-transform-runtime/node_modules/babel-plugin-polyfill-regenerator": {
"version": "0.6.2",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz",
- "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/helper-define-polyfill-provider": "^0.6.2"
},
@@ -1716,8 +1737,9 @@
},
"node_modules/@babel/plugin-transform-shorthand-properties": {
"version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz",
- "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5"
},
@@ -1730,8 +1752,9 @@
},
"node_modules/@babel/plugin-transform-spread": {
"version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz",
- "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5",
"@babel/helper-skip-transparent-expression-wrappers": "^7.22.5"
@@ -1745,8 +1768,9 @@
},
"node_modules/@babel/plugin-transform-sticky-regex": {
"version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz",
- "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5"
},
@@ -1759,8 +1783,9 @@
},
"node_modules/@babel/plugin-transform-template-literals": {
"version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz",
- "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5"
},
@@ -1773,8 +1798,8 @@
},
"node_modules/@babel/plugin-transform-typeof-symbol": {
"version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz",
- "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==",
+ "license": "MIT",
+ "optional": true,
"peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5"
@@ -1788,8 +1813,9 @@
},
"node_modules/@babel/plugin-transform-typescript": {
"version": "7.23.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.23.6.tgz",
- "integrity": "sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/helper-annotate-as-pure": "^7.22.5",
"@babel/helper-create-class-features-plugin": "^7.23.6",
@@ -1805,9 +1831,9 @@
},
"node_modules/@babel/plugin-transform-unicode-escapes": {
"version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz",
- "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==",
- "peer": true,
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5"
},
@@ -1820,8 +1846,8 @@
},
"node_modules/@babel/plugin-transform-unicode-property-regex": {
"version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz",
- "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==",
+ "license": "MIT",
+ "optional": true,
"peer": true,
"dependencies": {
"@babel/helper-create-regexp-features-plugin": "^7.22.15",
@@ -1836,8 +1862,9 @@
},
"node_modules/@babel/plugin-transform-unicode-regex": {
"version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz",
- "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/helper-create-regexp-features-plugin": "^7.22.15",
"@babel/helper-plugin-utils": "^7.22.5"
@@ -1851,8 +1878,8 @@
},
"node_modules/@babel/plugin-transform-unicode-sets-regex": {
"version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz",
- "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==",
+ "license": "MIT",
+ "optional": true,
"peer": true,
"dependencies": {
"@babel/helper-create-regexp-features-plugin": "^7.22.15",
@@ -1867,8 +1894,8 @@
},
"node_modules/@babel/preset-env": {
"version": "7.23.9",
- "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.9.tgz",
- "integrity": "sha512-3kBGTNBBk9DQiPoXYS0g0BYlwTQYUTifqgKTjxUwEUkduRT2QOa0FPGBJ+NROQhGyYO5BuTJwGvBnqKDykac6A==",
+ "license": "MIT",
+ "optional": true,
"peer": true,
"dependencies": {
"@babel/compat-data": "^7.23.5",
@@ -1961,8 +1988,9 @@
},
"node_modules/@babel/preset-flow": {
"version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.23.3.tgz",
- "integrity": "sha512-7yn6hl8RIv+KNk6iIrGZ+D06VhVY35wLVf23Cz/mMu1zOr7u4MMP4j0nZ9tLf8+4ZFpnib8cFYgB/oYg9hfswA==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5",
"@babel/helper-validator-option": "^7.22.15",
@@ -1977,8 +2005,8 @@
},
"node_modules/@babel/preset-modules": {
"version": "0.1.6-no-external-plugins",
- "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz",
- "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==",
+ "license": "MIT",
+ "optional": true,
"peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.0.0",
@@ -1991,8 +2019,9 @@
},
"node_modules/@babel/preset-typescript": {
"version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.3.tgz",
- "integrity": "sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/helper-plugin-utils": "^7.22.5",
"@babel/helper-validator-option": "^7.22.15",
@@ -2009,8 +2038,9 @@
},
"node_modules/@babel/register": {
"version": "7.23.7",
- "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.23.7.tgz",
- "integrity": "sha512-EjJeB6+kvpk+Y5DAkEAmbOBEFkh9OASx0huoEkqYTFxAZHzOAX2Oh5uwAUuL2rUddqfM0SA+KPXV2TbzoZ2kvQ==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"clone-deep": "^4.0.1",
"find-cache-dir": "^2.0.0",
@@ -2027,13 +2057,12 @@
},
"node_modules/@babel/regjsgen": {
"version": "0.8.0",
- "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz",
- "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA=="
+ "license": "MIT",
+ "optional": true,
+ "peer": true
},
"node_modules/@babel/runtime": {
"version": "7.26.10",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.10.tgz",
- "integrity": "sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==",
"license": "MIT",
"dependencies": {
"regenerator-runtime": "^0.14.0"
@@ -2044,8 +2073,6 @@
},
"node_modules/@babel/template": {
"version": "7.26.9",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz",
- "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==",
"license": "MIT",
"dependencies": {
"@babel/code-frame": "^7.26.2",
@@ -2058,8 +2085,6 @@
},
"node_modules/@babel/traverse": {
"version": "7.25.7",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.7.tgz",
- "integrity": "sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==",
"license": "MIT",
"dependencies": {
"@babel/code-frame": "^7.25.7",
@@ -2076,8 +2101,6 @@
},
"node_modules/@babel/types": {
"version": "7.26.10",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.10.tgz",
- "integrity": "sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==",
"license": "MIT",
"dependencies": {
"@babel/helper-string-parser": "^7.25.9",
@@ -2087,902 +2110,996 @@
"node": ">=6.9.0"
}
},
- "node_modules/@emotion/babel-plugin": {
- "version": "11.11.0",
- "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz",
- "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==",
+ "node_modules/@codingame/esbuild-import-meta-url-plugin": {
+ "version": "0.0.0-semantic-release",
+ "resolved": "https://gitpkg.vercel.app/hhu-adam/lean4monaco/esbuild-import-meta-url-plugin?main",
+ "integrity": "sha512-GsomARMjJmBXrqEzhL1rBo8pmnx9OiFydbngOaOFtmvItUxr3Ch/OEyqxX5mlso4f3i/Oa83ttJcX8hmzk0bHg==",
+ "dev": true,
+ "license": "ISC",
"dependencies": {
- "@babel/helper-module-imports": "^7.16.7",
- "@babel/runtime": "^7.18.3",
- "@emotion/hash": "^0.9.1",
- "@emotion/memoize": "^0.8.1",
- "@emotion/serialize": "^1.1.2",
- "babel-plugin-macros": "^3.1.0",
- "convert-source-map": "^1.5.0",
- "escape-string-regexp": "^4.0.0",
- "find-root": "^1.1.0",
- "source-map": "^0.5.7",
- "stylis": "4.2.0"
+ "esbuild": ">=0.19.x",
+ "import-meta-resolve": "^4.0.0"
}
},
- "node_modules/@emotion/babel-plugin/node_modules/convert-source-map": {
- "version": "1.9.0",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
- "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="
- },
- "node_modules/@emotion/cache": {
- "version": "11.11.0",
- "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz",
- "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==",
+ "node_modules/@codingame/monaco-vscode-base-service-override": {
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-base-service-override/-/monaco-vscode-base-service-override-8.0.4.tgz",
+ "integrity": "sha512-tTIA68KRYgSPHyanjqTUGQro+t67vShxAGNjM2Iz7dhqMOYZhYA4oIwI4Q0A+QWBC2HKOCNkwFoc5pqconw5YA==",
+ "license": "MIT",
"dependencies": {
- "@emotion/memoize": "^0.8.1",
- "@emotion/sheet": "^1.2.2",
- "@emotion/utils": "^1.2.1",
- "@emotion/weak-memoize": "^0.3.1",
- "stylis": "4.2.0"
+ "vscode": "npm:@codingame/monaco-vscode-api@8.0.4"
}
},
- "node_modules/@emotion/hash": {
- "version": "0.9.1",
- "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz",
- "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ=="
- },
- "node_modules/@emotion/is-prop-valid": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz",
- "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==",
+ "node_modules/@codingame/monaco-vscode-base-service-override/node_modules/vscode": {
+ "name": "@codingame/monaco-vscode-api",
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-api/-/monaco-vscode-api-8.0.4.tgz",
+ "integrity": "sha512-qZ+HwIijDvzwwWscMA73y9ARu5zUaENOdzi0jQftJP9j2k96cRghsaCV25OgnmpZ/1BemjB4HhHCcr71Gq+GPQ==",
+ "license": "MIT",
"dependencies": {
- "@emotion/memoize": "^0.8.1"
+ "@codingame/monaco-vscode-base-service-override": "8.0.4",
+ "@codingame/monaco-vscode-environment-service-override": "8.0.4",
+ "@codingame/monaco-vscode-extensions-service-override": "8.0.4",
+ "@codingame/monaco-vscode-files-service-override": "8.0.4",
+ "@codingame/monaco-vscode-host-service-override": "8.0.4",
+ "@codingame/monaco-vscode-layout-service-override": "8.0.4",
+ "@codingame/monaco-vscode-quickaccess-service-override": "8.0.4",
+ "@vscode/iconv-lite-umd": "0.7.0",
+ "jschardet": "3.1.3"
}
},
- "node_modules/@emotion/memoize": {
- "version": "0.8.1",
- "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz",
- "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA=="
- },
- "node_modules/@emotion/react": {
- "version": "11.11.3",
- "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.3.tgz",
- "integrity": "sha512-Cnn0kuq4DoONOMcnoVsTOR8E+AdnKFf//6kUWc4LCdnxj31pZWn7rIULd6Y7/Js1PiPHzn7SKCM9vB/jBni8eA==",
+ "node_modules/@codingame/monaco-vscode-configuration-service-override": {
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-configuration-service-override/-/monaco-vscode-configuration-service-override-8.0.4.tgz",
+ "integrity": "sha512-Fx8wRY3G2s3fpcQWGBMEe7fUmDhPFSkn+b/DwPCTiyo9IX+uKk8w097XjJBwCk0wVHgOcYs4GKPsip5IqJkydw==",
+ "license": "MIT",
"dependencies": {
- "@babel/runtime": "^7.18.3",
- "@emotion/babel-plugin": "^11.11.0",
- "@emotion/cache": "^11.11.0",
- "@emotion/serialize": "^1.1.3",
- "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1",
- "@emotion/utils": "^1.2.1",
- "@emotion/weak-memoize": "^0.3.1",
- "hoist-non-react-statics": "^3.3.1"
- },
- "peerDependencies": {
- "react": ">=16.8.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
+ "@codingame/monaco-vscode-files-service-override": "8.0.4",
+ "vscode": "npm:@codingame/monaco-vscode-api@8.0.4"
}
},
- "node_modules/@emotion/serialize": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.3.tgz",
- "integrity": "sha512-iD4D6QVZFDhcbH0RAG1uVu1CwVLMWUkCvAqqlewO/rxf8+87yIBAlt4+AxMiiKPLs5hFc0owNk/sLLAOROw3cA==",
+ "node_modules/@codingame/monaco-vscode-configuration-service-override/node_modules/vscode": {
+ "name": "@codingame/monaco-vscode-api",
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-api/-/monaco-vscode-api-8.0.4.tgz",
+ "integrity": "sha512-qZ+HwIijDvzwwWscMA73y9ARu5zUaENOdzi0jQftJP9j2k96cRghsaCV25OgnmpZ/1BemjB4HhHCcr71Gq+GPQ==",
+ "license": "MIT",
"dependencies": {
- "@emotion/hash": "^0.9.1",
- "@emotion/memoize": "^0.8.1",
- "@emotion/unitless": "^0.8.1",
- "@emotion/utils": "^1.2.1",
- "csstype": "^3.0.2"
+ "@codingame/monaco-vscode-base-service-override": "8.0.4",
+ "@codingame/monaco-vscode-environment-service-override": "8.0.4",
+ "@codingame/monaco-vscode-extensions-service-override": "8.0.4",
+ "@codingame/monaco-vscode-files-service-override": "8.0.4",
+ "@codingame/monaco-vscode-host-service-override": "8.0.4",
+ "@codingame/monaco-vscode-layout-service-override": "8.0.4",
+ "@codingame/monaco-vscode-quickaccess-service-override": "8.0.4",
+ "@vscode/iconv-lite-umd": "0.7.0",
+ "jschardet": "3.1.3"
}
},
- "node_modules/@emotion/sheet": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz",
- "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA=="
+ "node_modules/@codingame/monaco-vscode-editor-service-override": {
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-editor-service-override/-/monaco-vscode-editor-service-override-8.0.4.tgz",
+ "integrity": "sha512-is77poIqjYAcve9AYlUrkMfgtjWlH1D9ebxGjk4Y2UHvmQvsrRFuaGvzEt4YpgNLd+0hSyuH+R0HWSOq3uN2BA==",
+ "license": "MIT",
+ "dependencies": {
+ "vscode": "npm:@codingame/monaco-vscode-api@8.0.4"
+ }
},
- "node_modules/@emotion/styled": {
- "version": "11.11.0",
- "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.0.tgz",
- "integrity": "sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==",
+ "node_modules/@codingame/monaco-vscode-editor-service-override/node_modules/vscode": {
+ "name": "@codingame/monaco-vscode-api",
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-api/-/monaco-vscode-api-8.0.4.tgz",
+ "integrity": "sha512-qZ+HwIijDvzwwWscMA73y9ARu5zUaENOdzi0jQftJP9j2k96cRghsaCV25OgnmpZ/1BemjB4HhHCcr71Gq+GPQ==",
+ "license": "MIT",
"dependencies": {
- "@babel/runtime": "^7.18.3",
- "@emotion/babel-plugin": "^11.11.0",
- "@emotion/is-prop-valid": "^1.2.1",
- "@emotion/serialize": "^1.1.2",
- "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1",
- "@emotion/utils": "^1.2.1"
- },
- "peerDependencies": {
- "@emotion/react": "^11.0.0-rc.0",
- "react": ">=16.8.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
+ "@codingame/monaco-vscode-base-service-override": "8.0.4",
+ "@codingame/monaco-vscode-environment-service-override": "8.0.4",
+ "@codingame/monaco-vscode-extensions-service-override": "8.0.4",
+ "@codingame/monaco-vscode-files-service-override": "8.0.4",
+ "@codingame/monaco-vscode-host-service-override": "8.0.4",
+ "@codingame/monaco-vscode-layout-service-override": "8.0.4",
+ "@codingame/monaco-vscode-quickaccess-service-override": "8.0.4",
+ "@vscode/iconv-lite-umd": "0.7.0",
+ "jschardet": "3.1.3"
}
},
- "node_modules/@emotion/unitless": {
- "version": "0.8.1",
- "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz",
- "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ=="
+ "node_modules/@codingame/monaco-vscode-environment-service-override": {
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-environment-service-override/-/monaco-vscode-environment-service-override-8.0.4.tgz",
+ "integrity": "sha512-3PBqEag0RaACIYiPdtDqxn4BS48yMq1uNCrNYm9E2P1On7JaCLNPHrQfE9Et6HbJT9qPzdcfbD5IwevQbCym5Q==",
+ "license": "MIT",
+ "dependencies": {
+ "vscode": "npm:@codingame/monaco-vscode-api@8.0.4"
+ }
},
- "node_modules/@emotion/use-insertion-effect-with-fallbacks": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz",
- "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==",
- "peerDependencies": {
- "react": ">=16.8.0"
+ "node_modules/@codingame/monaco-vscode-environment-service-override/node_modules/vscode": {
+ "name": "@codingame/monaco-vscode-api",
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-api/-/monaco-vscode-api-8.0.4.tgz",
+ "integrity": "sha512-qZ+HwIijDvzwwWscMA73y9ARu5zUaENOdzi0jQftJP9j2k96cRghsaCV25OgnmpZ/1BemjB4HhHCcr71Gq+GPQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@codingame/monaco-vscode-base-service-override": "8.0.4",
+ "@codingame/monaco-vscode-environment-service-override": "8.0.4",
+ "@codingame/monaco-vscode-extensions-service-override": "8.0.4",
+ "@codingame/monaco-vscode-files-service-override": "8.0.4",
+ "@codingame/monaco-vscode-host-service-override": "8.0.4",
+ "@codingame/monaco-vscode-layout-service-override": "8.0.4",
+ "@codingame/monaco-vscode-quickaccess-service-override": "8.0.4",
+ "@vscode/iconv-lite-umd": "0.7.0",
+ "jschardet": "3.1.3"
}
},
- "node_modules/@emotion/utils": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz",
- "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg=="
+ "node_modules/@codingame/monaco-vscode-extensions-service-override": {
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-extensions-service-override/-/monaco-vscode-extensions-service-override-8.0.4.tgz",
+ "integrity": "sha512-uEOpSXGxC6W3uaKwj5p+WXsvkVqD1ONDNOCy8ZEHskpkN6KO/0XE927OvpF75JsqXHjNTmstSxTjU9/GykpruA==",
+ "license": "MIT",
+ "dependencies": {
+ "@codingame/monaco-vscode-files-service-override": "8.0.4",
+ "vscode": "npm:@codingame/monaco-vscode-api@8.0.4"
+ }
},
- "node_modules/@emotion/weak-memoize": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz",
- "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww=="
+ "node_modules/@codingame/monaco-vscode-extensions-service-override/node_modules/vscode": {
+ "name": "@codingame/monaco-vscode-api",
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-api/-/monaco-vscode-api-8.0.4.tgz",
+ "integrity": "sha512-qZ+HwIijDvzwwWscMA73y9ARu5zUaENOdzi0jQftJP9j2k96cRghsaCV25OgnmpZ/1BemjB4HhHCcr71Gq+GPQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@codingame/monaco-vscode-base-service-override": "8.0.4",
+ "@codingame/monaco-vscode-environment-service-override": "8.0.4",
+ "@codingame/monaco-vscode-extensions-service-override": "8.0.4",
+ "@codingame/monaco-vscode-files-service-override": "8.0.4",
+ "@codingame/monaco-vscode-host-service-override": "8.0.4",
+ "@codingame/monaco-vscode-layout-service-override": "8.0.4",
+ "@codingame/monaco-vscode-quickaccess-service-override": "8.0.4",
+ "@vscode/iconv-lite-umd": "0.7.0",
+ "jschardet": "3.1.3"
+ }
},
- "node_modules/@esbuild/aix-ppc64": {
- "version": "0.25.0",
- "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.0.tgz",
- "integrity": "sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==",
- "cpu": [
- "ppc64"
- ],
+ "node_modules/@codingame/monaco-vscode-files-service-override": {
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-files-service-override/-/monaco-vscode-files-service-override-8.0.4.tgz",
+ "integrity": "sha512-DCvbxgE6wwOoUsKGlinOB7vYx7HoVUviqWY913Fux4K7/wYWpBcNVtK8kmKs7euPJPeAsl06PJFaXaS3Qjfkqg==",
"license": "MIT",
- "optional": true,
- "os": [
- "aix"
- ],
- "engines": {
- "node": ">=18"
+ "dependencies": {
+ "vscode": "npm:@codingame/monaco-vscode-api@8.0.4"
}
},
- "node_modules/@esbuild/android-arm": {
- "version": "0.25.0",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.0.tgz",
- "integrity": "sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==",
- "cpu": [
- "arm"
- ],
+ "node_modules/@codingame/monaco-vscode-files-service-override/node_modules/vscode": {
+ "name": "@codingame/monaco-vscode-api",
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-api/-/monaco-vscode-api-8.0.4.tgz",
+ "integrity": "sha512-qZ+HwIijDvzwwWscMA73y9ARu5zUaENOdzi0jQftJP9j2k96cRghsaCV25OgnmpZ/1BemjB4HhHCcr71Gq+GPQ==",
"license": "MIT",
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=18"
+ "dependencies": {
+ "@codingame/monaco-vscode-base-service-override": "8.0.4",
+ "@codingame/monaco-vscode-environment-service-override": "8.0.4",
+ "@codingame/monaco-vscode-extensions-service-override": "8.0.4",
+ "@codingame/monaco-vscode-files-service-override": "8.0.4",
+ "@codingame/monaco-vscode-host-service-override": "8.0.4",
+ "@codingame/monaco-vscode-layout-service-override": "8.0.4",
+ "@codingame/monaco-vscode-quickaccess-service-override": "8.0.4",
+ "@vscode/iconv-lite-umd": "0.7.0",
+ "jschardet": "3.1.3"
}
},
- "node_modules/@esbuild/android-arm64": {
- "version": "0.25.0",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.0.tgz",
- "integrity": "sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==",
- "cpu": [
- "arm64"
- ],
+ "node_modules/@codingame/monaco-vscode-host-service-override": {
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-host-service-override/-/monaco-vscode-host-service-override-8.0.4.tgz",
+ "integrity": "sha512-VT8jFmnzMpi6DuSgA8c/F0MVh+fApLH75ledgMqfsKC1vSDOkV0IaPPBHRfPYDPvXCrnOtfdpvP0hFrdg1ytig==",
"license": "MIT",
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=18"
+ "dependencies": {
+ "vscode": "npm:@codingame/monaco-vscode-api@8.0.4"
}
},
- "node_modules/@esbuild/android-x64": {
- "version": "0.25.0",
- "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.0.tgz",
- "integrity": "sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==",
- "cpu": [
- "x64"
- ],
+ "node_modules/@codingame/monaco-vscode-host-service-override/node_modules/vscode": {
+ "name": "@codingame/monaco-vscode-api",
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-api/-/monaco-vscode-api-8.0.4.tgz",
+ "integrity": "sha512-qZ+HwIijDvzwwWscMA73y9ARu5zUaENOdzi0jQftJP9j2k96cRghsaCV25OgnmpZ/1BemjB4HhHCcr71Gq+GPQ==",
"license": "MIT",
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=18"
+ "dependencies": {
+ "@codingame/monaco-vscode-base-service-override": "8.0.4",
+ "@codingame/monaco-vscode-environment-service-override": "8.0.4",
+ "@codingame/monaco-vscode-extensions-service-override": "8.0.4",
+ "@codingame/monaco-vscode-files-service-override": "8.0.4",
+ "@codingame/monaco-vscode-host-service-override": "8.0.4",
+ "@codingame/monaco-vscode-layout-service-override": "8.0.4",
+ "@codingame/monaco-vscode-quickaccess-service-override": "8.0.4",
+ "@vscode/iconv-lite-umd": "0.7.0",
+ "jschardet": "3.1.3"
}
},
- "node_modules/@esbuild/darwin-arm64": {
- "version": "0.25.0",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.0.tgz",
- "integrity": "sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==",
- "cpu": [
- "arm64"
- ],
+ "node_modules/@codingame/monaco-vscode-language-pack-cs": {
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-language-pack-cs/-/monaco-vscode-language-pack-cs-8.0.4.tgz",
+ "integrity": "sha512-ijeMCVxDhNv2M1h92pMCYx8P4nBUTWlAisnAnrDASNJa3V6bFjCo+r0jXKruOjZhjtO0VOYsX0r1s0VUq1Otuw==",
"license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">=18"
+ "dependencies": {
+ "vscode": "npm:@codingame/monaco-vscode-api@8.0.4"
}
},
- "node_modules/@esbuild/darwin-x64": {
- "version": "0.25.0",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.0.tgz",
- "integrity": "sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==",
- "cpu": [
- "x64"
- ],
+ "node_modules/@codingame/monaco-vscode-language-pack-cs/node_modules/vscode": {
+ "name": "@codingame/monaco-vscode-api",
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-api/-/monaco-vscode-api-8.0.4.tgz",
+ "integrity": "sha512-qZ+HwIijDvzwwWscMA73y9ARu5zUaENOdzi0jQftJP9j2k96cRghsaCV25OgnmpZ/1BemjB4HhHCcr71Gq+GPQ==",
"license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">=18"
+ "dependencies": {
+ "@codingame/monaco-vscode-base-service-override": "8.0.4",
+ "@codingame/monaco-vscode-environment-service-override": "8.0.4",
+ "@codingame/monaco-vscode-extensions-service-override": "8.0.4",
+ "@codingame/monaco-vscode-files-service-override": "8.0.4",
+ "@codingame/monaco-vscode-host-service-override": "8.0.4",
+ "@codingame/monaco-vscode-layout-service-override": "8.0.4",
+ "@codingame/monaco-vscode-quickaccess-service-override": "8.0.4",
+ "@vscode/iconv-lite-umd": "0.7.0",
+ "jschardet": "3.1.3"
}
},
- "node_modules/@esbuild/freebsd-arm64": {
- "version": "0.25.0",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.0.tgz",
- "integrity": "sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==",
- "cpu": [
- "arm64"
- ],
+ "node_modules/@codingame/monaco-vscode-language-pack-de": {
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-language-pack-de/-/monaco-vscode-language-pack-de-8.0.4.tgz",
+ "integrity": "sha512-OehZUq8+z8KDnZPBH0xEU+Ph+D9GTssFPcMzdvxLSfY0xyxNDfC+rCemLGAfJydtONVKde5WsOWvozM5PJ+uEQ==",
"license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">=18"
+ "dependencies": {
+ "vscode": "npm:@codingame/monaco-vscode-api@8.0.4"
}
},
- "node_modules/@esbuild/freebsd-x64": {
- "version": "0.25.0",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.0.tgz",
- "integrity": "sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==",
- "cpu": [
- "x64"
- ],
+ "node_modules/@codingame/monaco-vscode-language-pack-de/node_modules/vscode": {
+ "name": "@codingame/monaco-vscode-api",
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-api/-/monaco-vscode-api-8.0.4.tgz",
+ "integrity": "sha512-qZ+HwIijDvzwwWscMA73y9ARu5zUaENOdzi0jQftJP9j2k96cRghsaCV25OgnmpZ/1BemjB4HhHCcr71Gq+GPQ==",
"license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">=18"
+ "dependencies": {
+ "@codingame/monaco-vscode-base-service-override": "8.0.4",
+ "@codingame/monaco-vscode-environment-service-override": "8.0.4",
+ "@codingame/monaco-vscode-extensions-service-override": "8.0.4",
+ "@codingame/monaco-vscode-files-service-override": "8.0.4",
+ "@codingame/monaco-vscode-host-service-override": "8.0.4",
+ "@codingame/monaco-vscode-layout-service-override": "8.0.4",
+ "@codingame/monaco-vscode-quickaccess-service-override": "8.0.4",
+ "@vscode/iconv-lite-umd": "0.7.0",
+ "jschardet": "3.1.3"
}
},
- "node_modules/@esbuild/linux-arm": {
- "version": "0.25.0",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.0.tgz",
- "integrity": "sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==",
- "cpu": [
- "arm"
- ],
+ "node_modules/@codingame/monaco-vscode-language-pack-es": {
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-language-pack-es/-/monaco-vscode-language-pack-es-8.0.4.tgz",
+ "integrity": "sha512-+mB2aeWnn+Nz4s8zopaEQWqhZLvsUM/SGcsqpjy/liU0D6M8qhc8XyAbOS3dORTFtFVIhxj/MVW7I8E2fhJd1Q==",
"license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
+ "dependencies": {
+ "vscode": "npm:@codingame/monaco-vscode-api@8.0.4"
}
},
- "node_modules/@esbuild/linux-arm64": {
- "version": "0.25.0",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.0.tgz",
- "integrity": "sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==",
- "cpu": [
- "arm64"
- ],
+ "node_modules/@codingame/monaco-vscode-language-pack-es/node_modules/vscode": {
+ "name": "@codingame/monaco-vscode-api",
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-api/-/monaco-vscode-api-8.0.4.tgz",
+ "integrity": "sha512-qZ+HwIijDvzwwWscMA73y9ARu5zUaENOdzi0jQftJP9j2k96cRghsaCV25OgnmpZ/1BemjB4HhHCcr71Gq+GPQ==",
"license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
+ "dependencies": {
+ "@codingame/monaco-vscode-base-service-override": "8.0.4",
+ "@codingame/monaco-vscode-environment-service-override": "8.0.4",
+ "@codingame/monaco-vscode-extensions-service-override": "8.0.4",
+ "@codingame/monaco-vscode-files-service-override": "8.0.4",
+ "@codingame/monaco-vscode-host-service-override": "8.0.4",
+ "@codingame/monaco-vscode-layout-service-override": "8.0.4",
+ "@codingame/monaco-vscode-quickaccess-service-override": "8.0.4",
+ "@vscode/iconv-lite-umd": "0.7.0",
+ "jschardet": "3.1.3"
}
},
- "node_modules/@esbuild/linux-ia32": {
- "version": "0.25.0",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.0.tgz",
- "integrity": "sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==",
- "cpu": [
- "ia32"
- ],
+ "node_modules/@codingame/monaco-vscode-language-pack-fr": {
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-language-pack-fr/-/monaco-vscode-language-pack-fr-8.0.4.tgz",
+ "integrity": "sha512-nhWM+uOVSzcnIGYr9GCEX00GJjgUt9xoW+TKLG1axayCpPboDoD8mbafaycNoYkz3aJIwhYytpKIzhl05EmIhg==",
"license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
+ "dependencies": {
+ "vscode": "npm:@codingame/monaco-vscode-api@8.0.4"
}
},
- "node_modules/@esbuild/linux-loong64": {
- "version": "0.25.0",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.0.tgz",
- "integrity": "sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==",
- "cpu": [
- "loong64"
- ],
+ "node_modules/@codingame/monaco-vscode-language-pack-fr/node_modules/vscode": {
+ "name": "@codingame/monaco-vscode-api",
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-api/-/monaco-vscode-api-8.0.4.tgz",
+ "integrity": "sha512-qZ+HwIijDvzwwWscMA73y9ARu5zUaENOdzi0jQftJP9j2k96cRghsaCV25OgnmpZ/1BemjB4HhHCcr71Gq+GPQ==",
"license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
+ "dependencies": {
+ "@codingame/monaco-vscode-base-service-override": "8.0.4",
+ "@codingame/monaco-vscode-environment-service-override": "8.0.4",
+ "@codingame/monaco-vscode-extensions-service-override": "8.0.4",
+ "@codingame/monaco-vscode-files-service-override": "8.0.4",
+ "@codingame/monaco-vscode-host-service-override": "8.0.4",
+ "@codingame/monaco-vscode-layout-service-override": "8.0.4",
+ "@codingame/monaco-vscode-quickaccess-service-override": "8.0.4",
+ "@vscode/iconv-lite-umd": "0.7.0",
+ "jschardet": "3.1.3"
}
},
- "node_modules/@esbuild/linux-mips64el": {
- "version": "0.25.0",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.0.tgz",
- "integrity": "sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==",
- "cpu": [
- "mips64el"
- ],
+ "node_modules/@codingame/monaco-vscode-language-pack-it": {
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-language-pack-it/-/monaco-vscode-language-pack-it-8.0.4.tgz",
+ "integrity": "sha512-BXXLAakXU8zumxQH9uRX4KIIPy/ZJjdI/7DWriASs0BU2rJwta9cRmGZshpl9IJMVB4HHLmUvEoXv3NXfGIu8A==",
"license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
+ "dependencies": {
+ "vscode": "npm:@codingame/monaco-vscode-api@8.0.4"
}
},
- "node_modules/@esbuild/linux-ppc64": {
- "version": "0.25.0",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.0.tgz",
- "integrity": "sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==",
- "cpu": [
- "ppc64"
- ],
+ "node_modules/@codingame/monaco-vscode-language-pack-it/node_modules/vscode": {
+ "name": "@codingame/monaco-vscode-api",
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-api/-/monaco-vscode-api-8.0.4.tgz",
+ "integrity": "sha512-qZ+HwIijDvzwwWscMA73y9ARu5zUaENOdzi0jQftJP9j2k96cRghsaCV25OgnmpZ/1BemjB4HhHCcr71Gq+GPQ==",
"license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
+ "dependencies": {
+ "@codingame/monaco-vscode-base-service-override": "8.0.4",
+ "@codingame/monaco-vscode-environment-service-override": "8.0.4",
+ "@codingame/monaco-vscode-extensions-service-override": "8.0.4",
+ "@codingame/monaco-vscode-files-service-override": "8.0.4",
+ "@codingame/monaco-vscode-host-service-override": "8.0.4",
+ "@codingame/monaco-vscode-layout-service-override": "8.0.4",
+ "@codingame/monaco-vscode-quickaccess-service-override": "8.0.4",
+ "@vscode/iconv-lite-umd": "0.7.0",
+ "jschardet": "3.1.3"
}
},
- "node_modules/@esbuild/linux-riscv64": {
- "version": "0.25.0",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.0.tgz",
- "integrity": "sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==",
- "cpu": [
- "riscv64"
- ],
+ "node_modules/@codingame/monaco-vscode-language-pack-ja": {
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-language-pack-ja/-/monaco-vscode-language-pack-ja-8.0.4.tgz",
+ "integrity": "sha512-G4Dv75fCZuRNL6lo0/T71iGVvRaIP039PV4icOZv2sIxatQEIPcnI89Bc4obHRmX8IzKIPKG4OYNixDzRno8dA==",
"license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
+ "dependencies": {
+ "vscode": "npm:@codingame/monaco-vscode-api@8.0.4"
}
},
- "node_modules/@esbuild/linux-s390x": {
- "version": "0.25.0",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.0.tgz",
- "integrity": "sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==",
- "cpu": [
- "s390x"
- ],
+ "node_modules/@codingame/monaco-vscode-language-pack-ja/node_modules/vscode": {
+ "name": "@codingame/monaco-vscode-api",
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-api/-/monaco-vscode-api-8.0.4.tgz",
+ "integrity": "sha512-qZ+HwIijDvzwwWscMA73y9ARu5zUaENOdzi0jQftJP9j2k96cRghsaCV25OgnmpZ/1BemjB4HhHCcr71Gq+GPQ==",
"license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
+ "dependencies": {
+ "@codingame/monaco-vscode-base-service-override": "8.0.4",
+ "@codingame/monaco-vscode-environment-service-override": "8.0.4",
+ "@codingame/monaco-vscode-extensions-service-override": "8.0.4",
+ "@codingame/monaco-vscode-files-service-override": "8.0.4",
+ "@codingame/monaco-vscode-host-service-override": "8.0.4",
+ "@codingame/monaco-vscode-layout-service-override": "8.0.4",
+ "@codingame/monaco-vscode-quickaccess-service-override": "8.0.4",
+ "@vscode/iconv-lite-umd": "0.7.0",
+ "jschardet": "3.1.3"
}
},
- "node_modules/@esbuild/linux-x64": {
- "version": "0.25.0",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.0.tgz",
- "integrity": "sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==",
- "cpu": [
- "x64"
- ],
+ "node_modules/@codingame/monaco-vscode-language-pack-ko": {
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-language-pack-ko/-/monaco-vscode-language-pack-ko-8.0.4.tgz",
+ "integrity": "sha512-+RSYTNci7V8EdaAzHKn5OGo9GH3LE9v1B4/MHo2d1iNvvsB3jJ3p4I69E7w0+g3cr7B+gFGfJYAvDHdQABd5Gg==",
"license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=18"
+ "dependencies": {
+ "vscode": "npm:@codingame/monaco-vscode-api@8.0.4"
}
},
- "node_modules/@esbuild/netbsd-arm64": {
- "version": "0.25.0",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.0.tgz",
- "integrity": "sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==",
- "cpu": [
- "arm64"
- ],
+ "node_modules/@codingame/monaco-vscode-language-pack-ko/node_modules/vscode": {
+ "name": "@codingame/monaco-vscode-api",
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-api/-/monaco-vscode-api-8.0.4.tgz",
+ "integrity": "sha512-qZ+HwIijDvzwwWscMA73y9ARu5zUaENOdzi0jQftJP9j2k96cRghsaCV25OgnmpZ/1BemjB4HhHCcr71Gq+GPQ==",
"license": "MIT",
- "optional": true,
- "os": [
- "netbsd"
- ],
- "engines": {
- "node": ">=18"
+ "dependencies": {
+ "@codingame/monaco-vscode-base-service-override": "8.0.4",
+ "@codingame/monaco-vscode-environment-service-override": "8.0.4",
+ "@codingame/monaco-vscode-extensions-service-override": "8.0.4",
+ "@codingame/monaco-vscode-files-service-override": "8.0.4",
+ "@codingame/monaco-vscode-host-service-override": "8.0.4",
+ "@codingame/monaco-vscode-layout-service-override": "8.0.4",
+ "@codingame/monaco-vscode-quickaccess-service-override": "8.0.4",
+ "@vscode/iconv-lite-umd": "0.7.0",
+ "jschardet": "3.1.3"
}
},
- "node_modules/@esbuild/netbsd-x64": {
- "version": "0.25.0",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.0.tgz",
- "integrity": "sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==",
- "cpu": [
- "x64"
- ],
+ "node_modules/@codingame/monaco-vscode-language-pack-pl": {
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-language-pack-pl/-/monaco-vscode-language-pack-pl-8.0.4.tgz",
+ "integrity": "sha512-YlFJEqUQ2j1bSiVBz1o59RZDsFaPVfhbnosMWV4B1iqW0qEXtQwUfdMeU0N8H3fq2v2ov6W79dOu9PlWyOW4Ww==",
"license": "MIT",
- "optional": true,
- "os": [
- "netbsd"
- ],
- "engines": {
- "node": ">=18"
+ "dependencies": {
+ "vscode": "npm:@codingame/monaco-vscode-api@8.0.4"
}
},
- "node_modules/@esbuild/openbsd-arm64": {
- "version": "0.25.0",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.0.tgz",
- "integrity": "sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==",
- "cpu": [
- "arm64"
- ],
+ "node_modules/@codingame/monaco-vscode-language-pack-pl/node_modules/vscode": {
+ "name": "@codingame/monaco-vscode-api",
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-api/-/monaco-vscode-api-8.0.4.tgz",
+ "integrity": "sha512-qZ+HwIijDvzwwWscMA73y9ARu5zUaENOdzi0jQftJP9j2k96cRghsaCV25OgnmpZ/1BemjB4HhHCcr71Gq+GPQ==",
"license": "MIT",
- "optional": true,
- "os": [
- "openbsd"
- ],
- "engines": {
- "node": ">=18"
+ "dependencies": {
+ "@codingame/monaco-vscode-base-service-override": "8.0.4",
+ "@codingame/monaco-vscode-environment-service-override": "8.0.4",
+ "@codingame/monaco-vscode-extensions-service-override": "8.0.4",
+ "@codingame/monaco-vscode-files-service-override": "8.0.4",
+ "@codingame/monaco-vscode-host-service-override": "8.0.4",
+ "@codingame/monaco-vscode-layout-service-override": "8.0.4",
+ "@codingame/monaco-vscode-quickaccess-service-override": "8.0.4",
+ "@vscode/iconv-lite-umd": "0.7.0",
+ "jschardet": "3.1.3"
}
},
- "node_modules/@esbuild/openbsd-x64": {
- "version": "0.25.0",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.0.tgz",
- "integrity": "sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==",
- "cpu": [
- "x64"
- ],
+ "node_modules/@codingame/monaco-vscode-language-pack-pt-br": {
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-language-pack-pt-br/-/monaco-vscode-language-pack-pt-br-8.0.4.tgz",
+ "integrity": "sha512-kwoVrjIYZhmRwajt3qrYRr6KW0UVxC/YV/c+MOjr2HKMUgy5fqo+BKmj/9lSfduyu5JPddZxKARTBw0oByVghA==",
"license": "MIT",
- "optional": true,
- "os": [
- "openbsd"
- ],
- "engines": {
- "node": ">=18"
+ "dependencies": {
+ "vscode": "npm:@codingame/monaco-vscode-api@8.0.4"
}
},
- "node_modules/@esbuild/sunos-x64": {
- "version": "0.25.0",
- "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.0.tgz",
- "integrity": "sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==",
- "cpu": [
- "x64"
- ],
+ "node_modules/@codingame/monaco-vscode-language-pack-pt-br/node_modules/vscode": {
+ "name": "@codingame/monaco-vscode-api",
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-api/-/monaco-vscode-api-8.0.4.tgz",
+ "integrity": "sha512-qZ+HwIijDvzwwWscMA73y9ARu5zUaENOdzi0jQftJP9j2k96cRghsaCV25OgnmpZ/1BemjB4HhHCcr71Gq+GPQ==",
"license": "MIT",
- "optional": true,
- "os": [
- "sunos"
- ],
- "engines": {
- "node": ">=18"
+ "dependencies": {
+ "@codingame/monaco-vscode-base-service-override": "8.0.4",
+ "@codingame/monaco-vscode-environment-service-override": "8.0.4",
+ "@codingame/monaco-vscode-extensions-service-override": "8.0.4",
+ "@codingame/monaco-vscode-files-service-override": "8.0.4",
+ "@codingame/monaco-vscode-host-service-override": "8.0.4",
+ "@codingame/monaco-vscode-layout-service-override": "8.0.4",
+ "@codingame/monaco-vscode-quickaccess-service-override": "8.0.4",
+ "@vscode/iconv-lite-umd": "0.7.0",
+ "jschardet": "3.1.3"
}
},
- "node_modules/@esbuild/win32-arm64": {
- "version": "0.25.0",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.0.tgz",
- "integrity": "sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==",
- "cpu": [
- "arm64"
- ],
+ "node_modules/@codingame/monaco-vscode-language-pack-qps-ploc": {
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-language-pack-qps-ploc/-/monaco-vscode-language-pack-qps-ploc-8.0.4.tgz",
+ "integrity": "sha512-TJK9YuCHf2RHK3NcoiIAgjyna1lv6ndN70t13wf9pN+GyOE7XfYUVJj0YrQDbNCXiSeaTxgJtt0VQZmeN6RHjQ==",
"license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=18"
+ "dependencies": {
+ "vscode": "npm:@codingame/monaco-vscode-api@8.0.4"
}
},
- "node_modules/@esbuild/win32-ia32": {
- "version": "0.25.0",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.0.tgz",
- "integrity": "sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==",
- "cpu": [
- "ia32"
- ],
+ "node_modules/@codingame/monaco-vscode-language-pack-qps-ploc/node_modules/vscode": {
+ "name": "@codingame/monaco-vscode-api",
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-api/-/monaco-vscode-api-8.0.4.tgz",
+ "integrity": "sha512-qZ+HwIijDvzwwWscMA73y9ARu5zUaENOdzi0jQftJP9j2k96cRghsaCV25OgnmpZ/1BemjB4HhHCcr71Gq+GPQ==",
"license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=18"
+ "dependencies": {
+ "@codingame/monaco-vscode-base-service-override": "8.0.4",
+ "@codingame/monaco-vscode-environment-service-override": "8.0.4",
+ "@codingame/monaco-vscode-extensions-service-override": "8.0.4",
+ "@codingame/monaco-vscode-files-service-override": "8.0.4",
+ "@codingame/monaco-vscode-host-service-override": "8.0.4",
+ "@codingame/monaco-vscode-layout-service-override": "8.0.4",
+ "@codingame/monaco-vscode-quickaccess-service-override": "8.0.4",
+ "@vscode/iconv-lite-umd": "0.7.0",
+ "jschardet": "3.1.3"
}
},
- "node_modules/@esbuild/win32-x64": {
- "version": "0.25.0",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.0.tgz",
- "integrity": "sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==",
- "cpu": [
- "x64"
- ],
+ "node_modules/@codingame/monaco-vscode-language-pack-ru": {
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-language-pack-ru/-/monaco-vscode-language-pack-ru-8.0.4.tgz",
+ "integrity": "sha512-4rZDZU9VNJCIDM8hwLJQYhUnsQu3qcVONpb1muRFGKYhh9NwAELAwl2XW+ybsTC/B/4Qysk7cB1IxrTt4AhNjg==",
"license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=18"
+ "dependencies": {
+ "vscode": "npm:@codingame/monaco-vscode-api@8.0.4"
}
},
- "node_modules/@floating-ui/core": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz",
- "integrity": "sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==",
+ "node_modules/@codingame/monaco-vscode-language-pack-ru/node_modules/vscode": {
+ "name": "@codingame/monaco-vscode-api",
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-api/-/monaco-vscode-api-8.0.4.tgz",
+ "integrity": "sha512-qZ+HwIijDvzwwWscMA73y9ARu5zUaENOdzi0jQftJP9j2k96cRghsaCV25OgnmpZ/1BemjB4HhHCcr71Gq+GPQ==",
+ "license": "MIT",
"dependencies": {
- "@floating-ui/utils": "^0.2.1"
+ "@codingame/monaco-vscode-base-service-override": "8.0.4",
+ "@codingame/monaco-vscode-environment-service-override": "8.0.4",
+ "@codingame/monaco-vscode-extensions-service-override": "8.0.4",
+ "@codingame/monaco-vscode-files-service-override": "8.0.4",
+ "@codingame/monaco-vscode-host-service-override": "8.0.4",
+ "@codingame/monaco-vscode-layout-service-override": "8.0.4",
+ "@codingame/monaco-vscode-quickaccess-service-override": "8.0.4",
+ "@vscode/iconv-lite-umd": "0.7.0",
+ "jschardet": "3.1.3"
}
},
- "node_modules/@floating-ui/dom": {
- "version": "1.6.1",
- "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.1.tgz",
- "integrity": "sha512-iA8qE43/H5iGozC3W0YSnVSW42Vh522yyM1gj+BqRwVsTNOyr231PsXDaV04yT39PsO0QL2QpbI/M0ZaLUQgRQ==",
+ "node_modules/@codingame/monaco-vscode-language-pack-tr": {
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-language-pack-tr/-/monaco-vscode-language-pack-tr-8.0.4.tgz",
+ "integrity": "sha512-cqtF5drmuFp/wKmJvm9l6Unc+AF4vn48t0KJBZ1/QRxTZnRlwT5Dm+z0JR880O8WsSUkzJIG93/wBAzpv+6/Bg==",
+ "license": "MIT",
"dependencies": {
- "@floating-ui/core": "^1.6.0",
- "@floating-ui/utils": "^0.2.1"
+ "vscode": "npm:@codingame/monaco-vscode-api@8.0.4"
}
},
- "node_modules/@floating-ui/react-dom": {
- "version": "2.0.8",
- "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.8.tgz",
- "integrity": "sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==",
+ "node_modules/@codingame/monaco-vscode-language-pack-tr/node_modules/vscode": {
+ "name": "@codingame/monaco-vscode-api",
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-api/-/monaco-vscode-api-8.0.4.tgz",
+ "integrity": "sha512-qZ+HwIijDvzwwWscMA73y9ARu5zUaENOdzi0jQftJP9j2k96cRghsaCV25OgnmpZ/1BemjB4HhHCcr71Gq+GPQ==",
+ "license": "MIT",
"dependencies": {
- "@floating-ui/dom": "^1.6.1"
- },
- "peerDependencies": {
- "react": ">=16.8.0",
- "react-dom": ">=16.8.0"
+ "@codingame/monaco-vscode-base-service-override": "8.0.4",
+ "@codingame/monaco-vscode-environment-service-override": "8.0.4",
+ "@codingame/monaco-vscode-extensions-service-override": "8.0.4",
+ "@codingame/monaco-vscode-files-service-override": "8.0.4",
+ "@codingame/monaco-vscode-host-service-override": "8.0.4",
+ "@codingame/monaco-vscode-layout-service-override": "8.0.4",
+ "@codingame/monaco-vscode-quickaccess-service-override": "8.0.4",
+ "@vscode/iconv-lite-umd": "0.7.0",
+ "jschardet": "3.1.3"
}
},
- "node_modules/@floating-ui/utils": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz",
- "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q=="
- },
- "node_modules/@fontsource/roboto": {
- "version": "4.5.8",
- "resolved": "https://registry.npmjs.org/@fontsource/roboto/-/roboto-4.5.8.tgz",
- "integrity": "sha512-CnD7zLItIzt86q4Sj3kZUiLcBk1dSk81qcqgMGaZe7SQ1P8hFNxhMl5AZthK1zrDM5m74VVhaOpuMGIL4gagaA=="
- },
- "node_modules/@fontsource/roboto-mono": {
- "version": "4.5.10",
- "resolved": "https://registry.npmjs.org/@fontsource/roboto-mono/-/roboto-mono-4.5.10.tgz",
- "integrity": "sha512-KrJdmkqz6DszT2wV/bbhXef4r0hV3B0vw2mAqei8A2kRnvq+gcJLmmIeQ94vu9VEXrUQzos5M9lH1TAAXpRphw=="
+ "node_modules/@codingame/monaco-vscode-language-pack-zh-hans": {
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-language-pack-zh-hans/-/monaco-vscode-language-pack-zh-hans-8.0.4.tgz",
+ "integrity": "sha512-a8R+IUggCI/UVv4uDy7XzjOwB3WAt+KX8ElsAqzJB9Y5BbFW5/a1Pxca0UXJ2vQabcls4TcrIi2yR30jnlBgww==",
+ "license": "MIT",
+ "dependencies": {
+ "vscode": "npm:@codingame/monaco-vscode-api@8.0.4"
+ }
},
- "node_modules/@fortawesome/fontawesome-common-types": {
- "version": "6.5.1",
- "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.5.1.tgz",
- "integrity": "sha512-GkWzv+L6d2bI5f/Vk6ikJ9xtl7dfXtoRu3YGE6nq0p/FFqA1ebMOAWg3XgRyb0I6LYyYkiAo+3/KrwuBp8xG7A==",
- "hasInstallScript": true,
- "engines": {
- "node": ">=6"
+ "node_modules/@codingame/monaco-vscode-language-pack-zh-hans/node_modules/vscode": {
+ "name": "@codingame/monaco-vscode-api",
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-api/-/monaco-vscode-api-8.0.4.tgz",
+ "integrity": "sha512-qZ+HwIijDvzwwWscMA73y9ARu5zUaENOdzi0jQftJP9j2k96cRghsaCV25OgnmpZ/1BemjB4HhHCcr71Gq+GPQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@codingame/monaco-vscode-base-service-override": "8.0.4",
+ "@codingame/monaco-vscode-environment-service-override": "8.0.4",
+ "@codingame/monaco-vscode-extensions-service-override": "8.0.4",
+ "@codingame/monaco-vscode-files-service-override": "8.0.4",
+ "@codingame/monaco-vscode-host-service-override": "8.0.4",
+ "@codingame/monaco-vscode-layout-service-override": "8.0.4",
+ "@codingame/monaco-vscode-quickaccess-service-override": "8.0.4",
+ "@vscode/iconv-lite-umd": "0.7.0",
+ "jschardet": "3.1.3"
}
},
- "node_modules/@fortawesome/fontawesome-svg-core": {
- "version": "6.5.1",
- "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.5.1.tgz",
- "integrity": "sha512-MfRCYlQPXoLlpem+egxjfkEuP9UQswTrlCOsknus/NcMoblTH2g0jPrapbcIb04KGA7E2GZxbAccGZfWoYgsrQ==",
- "hasInstallScript": true,
+ "node_modules/@codingame/monaco-vscode-language-pack-zh-hant": {
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-language-pack-zh-hant/-/monaco-vscode-language-pack-zh-hant-8.0.4.tgz",
+ "integrity": "sha512-g3b/apaTc/bg5isOEvxir38bbYzd/CuBY0MWtXw1NKXc0GPsTo4j5eAuT2R4qT1pJ9XgbMBbYQAMLX3DxSJRxA==",
+ "license": "MIT",
"dependencies": {
- "@fortawesome/fontawesome-common-types": "6.5.1"
- },
- "engines": {
- "node": ">=6"
+ "vscode": "npm:@codingame/monaco-vscode-api@8.0.4"
}
},
- "node_modules/@fortawesome/free-regular-svg-icons": {
- "version": "6.5.1",
- "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-6.5.1.tgz",
- "integrity": "sha512-m6ShXn+wvqEU69wSP84coxLbNl7sGVZb+Ca+XZq6k30SzuP3X4TfPqtycgUh9ASwlNh5OfQCd8pDIWxl+O+LlQ==",
- "hasInstallScript": true,
+ "node_modules/@codingame/monaco-vscode-language-pack-zh-hant/node_modules/vscode": {
+ "name": "@codingame/monaco-vscode-api",
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-api/-/monaco-vscode-api-8.0.4.tgz",
+ "integrity": "sha512-qZ+HwIijDvzwwWscMA73y9ARu5zUaENOdzi0jQftJP9j2k96cRghsaCV25OgnmpZ/1BemjB4HhHCcr71Gq+GPQ==",
+ "license": "MIT",
"dependencies": {
- "@fortawesome/fontawesome-common-types": "6.5.1"
- },
- "engines": {
- "node": ">=6"
+ "@codingame/monaco-vscode-base-service-override": "8.0.4",
+ "@codingame/monaco-vscode-environment-service-override": "8.0.4",
+ "@codingame/monaco-vscode-extensions-service-override": "8.0.4",
+ "@codingame/monaco-vscode-files-service-override": "8.0.4",
+ "@codingame/monaco-vscode-host-service-override": "8.0.4",
+ "@codingame/monaco-vscode-layout-service-override": "8.0.4",
+ "@codingame/monaco-vscode-quickaccess-service-override": "8.0.4",
+ "@vscode/iconv-lite-umd": "0.7.0",
+ "jschardet": "3.1.3"
}
},
- "node_modules/@fortawesome/free-solid-svg-icons": {
- "version": "6.5.1",
- "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.5.1.tgz",
- "integrity": "sha512-S1PPfU3mIJa59biTtXJz1oI0+KAXW6bkAb31XKhxdxtuXDiUIFsih4JR1v5BbxY7hVHsD1RKq+jRkVRaf773NQ==",
- "hasInstallScript": true,
+ "node_modules/@codingame/monaco-vscode-languages-service-override": {
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-languages-service-override/-/monaco-vscode-languages-service-override-8.0.4.tgz",
+ "integrity": "sha512-GXd2fKQa96tNv0gFB3nT/yWUc+4pZM/2L8KcfOOuNRWEOjm9TbOWmNZyWGi2Abf4vAdLNKVtJBX1+SoDkwoQdw==",
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "@fortawesome/fontawesome-common-types": "6.5.1"
- },
- "engines": {
- "node": ">=6"
+ "@codingame/monaco-vscode-files-service-override": "8.0.4",
+ "vscode": "npm:@codingame/monaco-vscode-api@8.0.4"
}
},
- "node_modules/@fortawesome/react-fontawesome": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.0.tgz",
- "integrity": "sha512-uHg75Rb/XORTtVt7OS9WoK8uM276Ufi7gCzshVWkUJbHhh3svsUUeqXerrM96Wm7fRiDzfKRwSoahhMIkGAYHw==",
+ "node_modules/@codingame/monaco-vscode-languages-service-override/node_modules/vscode": {
+ "name": "@codingame/monaco-vscode-api",
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-api/-/monaco-vscode-api-8.0.4.tgz",
+ "integrity": "sha512-qZ+HwIijDvzwwWscMA73y9ARu5zUaENOdzi0jQftJP9j2k96cRghsaCV25OgnmpZ/1BemjB4HhHCcr71Gq+GPQ==",
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "prop-types": "^15.8.1"
- },
- "peerDependencies": {
- "@fortawesome/fontawesome-svg-core": "~1 || ~6",
- "react": ">=16.3"
+ "@codingame/monaco-vscode-base-service-override": "8.0.4",
+ "@codingame/monaco-vscode-environment-service-override": "8.0.4",
+ "@codingame/monaco-vscode-extensions-service-override": "8.0.4",
+ "@codingame/monaco-vscode-files-service-override": "8.0.4",
+ "@codingame/monaco-vscode-host-service-override": "8.0.4",
+ "@codingame/monaco-vscode-layout-service-override": "8.0.4",
+ "@codingame/monaco-vscode-quickaccess-service-override": "8.0.4",
+ "@vscode/iconv-lite-umd": "0.7.0",
+ "jschardet": "3.1.3"
}
},
- "node_modules/@gulpjs/to-absolute-glob": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/@gulpjs/to-absolute-glob/-/to-absolute-glob-4.0.0.tgz",
- "integrity": "sha512-kjotm7XJrJ6v+7knhPaRgaT6q8F8K2jiafwYdNHLzmV0uGLuZY43FK6smNSHUPrhq5kX2slCUy+RGG/xGqmIKA==",
- "dev": true,
+ "node_modules/@codingame/monaco-vscode-layout-service-override": {
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-layout-service-override/-/monaco-vscode-layout-service-override-8.0.4.tgz",
+ "integrity": "sha512-DrF1vRJG8vPOaqC06fu99yjvtIcuTza5vAQdH19FfDi87vyk3BeFsnj7H7Z0fRK/wQigBcNzXYbUkuE93I95IQ==",
+ "license": "MIT",
"dependencies": {
- "is-negated-glob": "^1.0.0"
- },
- "engines": {
- "node": ">=10.13.0"
+ "vscode": "npm:@codingame/monaco-vscode-api@8.0.4"
}
},
- "node_modules/@hapi/hoek": {
- "version": "9.3.0",
- "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz",
- "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==",
- "license": "BSD-3-Clause"
+ "node_modules/@codingame/monaco-vscode-layout-service-override/node_modules/vscode": {
+ "name": "@codingame/monaco-vscode-api",
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-api/-/monaco-vscode-api-8.0.4.tgz",
+ "integrity": "sha512-qZ+HwIijDvzwwWscMA73y9ARu5zUaENOdzi0jQftJP9j2k96cRghsaCV25OgnmpZ/1BemjB4HhHCcr71Gq+GPQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@codingame/monaco-vscode-base-service-override": "8.0.4",
+ "@codingame/monaco-vscode-environment-service-override": "8.0.4",
+ "@codingame/monaco-vscode-extensions-service-override": "8.0.4",
+ "@codingame/monaco-vscode-files-service-override": "8.0.4",
+ "@codingame/monaco-vscode-host-service-override": "8.0.4",
+ "@codingame/monaco-vscode-layout-service-override": "8.0.4",
+ "@codingame/monaco-vscode-quickaccess-service-override": "8.0.4",
+ "@vscode/iconv-lite-umd": "0.7.0",
+ "jschardet": "3.1.3"
+ }
},
- "node_modules/@hapi/topo": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz",
- "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==",
- "license": "BSD-3-Clause",
+ "node_modules/@codingame/monaco-vscode-localization-service-override": {
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-localization-service-override/-/monaco-vscode-localization-service-override-8.0.4.tgz",
+ "integrity": "sha512-z/MGZXSW69y3pIxbXobRfoGadN82BSSO7tu3jkhJx3c3CpvULaDl5HLUKoXDwtG14/nEA/VCzI/MOHp/bXBKDQ==",
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "@hapi/hoek": "^9.0.0"
+ "vscode": "npm:@codingame/monaco-vscode-api@8.0.4"
}
},
- "node_modules/@jest/create-cache-key-function": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-29.7.0.tgz",
- "integrity": "sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==",
+ "node_modules/@codingame/monaco-vscode-localization-service-override/node_modules/vscode": {
+ "name": "@codingame/monaco-vscode-api",
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-api/-/monaco-vscode-api-8.0.4.tgz",
+ "integrity": "sha512-qZ+HwIijDvzwwWscMA73y9ARu5zUaENOdzi0jQftJP9j2k96cRghsaCV25OgnmpZ/1BemjB4HhHCcr71Gq+GPQ==",
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "@jest/types": "^29.6.3"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "@codingame/monaco-vscode-base-service-override": "8.0.4",
+ "@codingame/monaco-vscode-environment-service-override": "8.0.4",
+ "@codingame/monaco-vscode-extensions-service-override": "8.0.4",
+ "@codingame/monaco-vscode-files-service-override": "8.0.4",
+ "@codingame/monaco-vscode-host-service-override": "8.0.4",
+ "@codingame/monaco-vscode-layout-service-override": "8.0.4",
+ "@codingame/monaco-vscode-quickaccess-service-override": "8.0.4",
+ "@vscode/iconv-lite-umd": "0.7.0",
+ "jschardet": "3.1.3"
}
},
- "node_modules/@jest/environment": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz",
- "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==",
+ "node_modules/@codingame/monaco-vscode-model-service-override": {
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-model-service-override/-/monaco-vscode-model-service-override-8.0.4.tgz",
+ "integrity": "sha512-oynV9SnSE1MfqtVjqDWy/xcmekmAVNzyoqTh6oH3B+Oy/nhPqI6X9yIA0I47u0ncs/wjj3dDVnXOEv2IqJXxZg==",
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "@jest/fake-timers": "^29.7.0",
- "@jest/types": "^29.6.3",
- "@types/node": "*",
- "jest-mock": "^29.7.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "vscode": "npm:@codingame/monaco-vscode-api@8.0.4"
}
},
- "node_modules/@jest/fake-timers": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz",
- "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==",
+ "node_modules/@codingame/monaco-vscode-model-service-override/node_modules/vscode": {
+ "name": "@codingame/monaco-vscode-api",
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-api/-/monaco-vscode-api-8.0.4.tgz",
+ "integrity": "sha512-qZ+HwIijDvzwwWscMA73y9ARu5zUaENOdzi0jQftJP9j2k96cRghsaCV25OgnmpZ/1BemjB4HhHCcr71Gq+GPQ==",
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "@jest/types": "^29.6.3",
- "@sinonjs/fake-timers": "^10.0.2",
- "@types/node": "*",
- "jest-message-util": "^29.7.0",
- "jest-mock": "^29.7.0",
- "jest-util": "^29.7.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "@codingame/monaco-vscode-base-service-override": "8.0.4",
+ "@codingame/monaco-vscode-environment-service-override": "8.0.4",
+ "@codingame/monaco-vscode-extensions-service-override": "8.0.4",
+ "@codingame/monaco-vscode-files-service-override": "8.0.4",
+ "@codingame/monaco-vscode-host-service-override": "8.0.4",
+ "@codingame/monaco-vscode-layout-service-override": "8.0.4",
+ "@codingame/monaco-vscode-quickaccess-service-override": "8.0.4",
+ "@vscode/iconv-lite-umd": "0.7.0",
+ "jschardet": "3.1.3"
}
},
- "node_modules/@jest/schemas": {
- "version": "29.6.3",
- "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz",
- "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==",
+ "node_modules/@codingame/monaco-vscode-monarch-service-override": {
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-monarch-service-override/-/monaco-vscode-monarch-service-override-8.0.4.tgz",
+ "integrity": "sha512-OrlE+ffvGf9C6xfkcO6rEiuy4GJQJQ+dSByxHyfLXA9qCWn/dHpYfjpr83YIlBG0tNoBdAYnx2iLgAo6y5Tzkw==",
+ "license": "MIT",
"dependencies": {
- "@sinclair/typebox": "^0.27.8"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "vscode": "npm:@codingame/monaco-vscode-api@8.0.4"
}
},
- "node_modules/@jest/types": {
- "version": "29.6.3",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz",
- "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==",
+ "node_modules/@codingame/monaco-vscode-monarch-service-override/node_modules/vscode": {
+ "name": "@codingame/monaco-vscode-api",
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-api/-/monaco-vscode-api-8.0.4.tgz",
+ "integrity": "sha512-qZ+HwIijDvzwwWscMA73y9ARu5zUaENOdzi0jQftJP9j2k96cRghsaCV25OgnmpZ/1BemjB4HhHCcr71Gq+GPQ==",
+ "license": "MIT",
"dependencies": {
- "@jest/schemas": "^29.6.3",
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^3.0.0",
- "@types/node": "*",
- "@types/yargs": "^17.0.8",
- "chalk": "^4.0.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "@codingame/monaco-vscode-base-service-override": "8.0.4",
+ "@codingame/monaco-vscode-environment-service-override": "8.0.4",
+ "@codingame/monaco-vscode-extensions-service-override": "8.0.4",
+ "@codingame/monaco-vscode-files-service-override": "8.0.4",
+ "@codingame/monaco-vscode-host-service-override": "8.0.4",
+ "@codingame/monaco-vscode-layout-service-override": "8.0.4",
+ "@codingame/monaco-vscode-quickaccess-service-override": "8.0.4",
+ "@vscode/iconv-lite-umd": "0.7.0",
+ "jschardet": "3.1.3"
}
},
- "node_modules/@jest/types/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==",
+ "node_modules/@codingame/monaco-vscode-quickaccess-service-override": {
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-quickaccess-service-override/-/monaco-vscode-quickaccess-service-override-8.0.4.tgz",
+ "integrity": "sha512-VXHVKRqtieKf+BTTUwcT++tJEb/k7PI2vLR3Lgsh2t0We7ydPOPLTDA99/Ls3yuM+i6IvKqBXc+WomN8MRS1rw==",
+ "license": "MIT",
"dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ "vscode": "npm:@codingame/monaco-vscode-api@8.0.4"
}
},
- "node_modules/@jest/types/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "node_modules/@codingame/monaco-vscode-quickaccess-service-override/node_modules/vscode": {
+ "name": "@codingame/monaco-vscode-api",
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-api/-/monaco-vscode-api-8.0.4.tgz",
+ "integrity": "sha512-qZ+HwIijDvzwwWscMA73y9ARu5zUaENOdzi0jQftJP9j2k96cRghsaCV25OgnmpZ/1BemjB4HhHCcr71Gq+GPQ==",
+ "license": "MIT",
"dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
+ "@codingame/monaco-vscode-base-service-override": "8.0.4",
+ "@codingame/monaco-vscode-environment-service-override": "8.0.4",
+ "@codingame/monaco-vscode-extensions-service-override": "8.0.4",
+ "@codingame/monaco-vscode-files-service-override": "8.0.4",
+ "@codingame/monaco-vscode-host-service-override": "8.0.4",
+ "@codingame/monaco-vscode-layout-service-override": "8.0.4",
+ "@codingame/monaco-vscode-quickaccess-service-override": "8.0.4",
+ "@vscode/iconv-lite-umd": "0.7.0",
+ "jschardet": "3.1.3"
}
},
- "node_modules/@jest/types/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==",
+ "node_modules/@codingame/monaco-vscode-textmate-service-override": {
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-textmate-service-override/-/monaco-vscode-textmate-service-override-8.0.4.tgz",
+ "integrity": "sha512-YDJoXCqnEimotWcqUlzU8bBah3+dqLAcIULJEV07K2DMFkKty78sc6w2CAItIlzmTeJApW2HpTdOgZehYqro3w==",
+ "license": "MIT",
"dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
+ "@codingame/monaco-vscode-files-service-override": "8.0.4",
+ "vscode": "npm:@codingame/monaco-vscode-api@8.0.4",
+ "vscode-oniguruma": "1.7.0",
+ "vscode-textmate": "9.0.0"
}
},
- "node_modules/@jest/types/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=="
+ "node_modules/@codingame/monaco-vscode-textmate-service-override/node_modules/vscode": {
+ "name": "@codingame/monaco-vscode-api",
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-api/-/monaco-vscode-api-8.0.4.tgz",
+ "integrity": "sha512-qZ+HwIijDvzwwWscMA73y9ARu5zUaENOdzi0jQftJP9j2k96cRghsaCV25OgnmpZ/1BemjB4HhHCcr71Gq+GPQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@codingame/monaco-vscode-base-service-override": "8.0.4",
+ "@codingame/monaco-vscode-environment-service-override": "8.0.4",
+ "@codingame/monaco-vscode-extensions-service-override": "8.0.4",
+ "@codingame/monaco-vscode-files-service-override": "8.0.4",
+ "@codingame/monaco-vscode-host-service-override": "8.0.4",
+ "@codingame/monaco-vscode-layout-service-override": "8.0.4",
+ "@codingame/monaco-vscode-quickaccess-service-override": "8.0.4",
+ "@vscode/iconv-lite-umd": "0.7.0",
+ "jschardet": "3.1.3"
+ }
+ },
+ "node_modules/@codingame/monaco-vscode-textmate-service-override/node_modules/vscode-textmate": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-9.0.0.tgz",
+ "integrity": "sha512-Cl65diFGxz7gpwbav10HqiY/eVYTO1sjQpmRmV991Bj7wAoOAjGQ97PpQcXorDE2Uc4hnGWLY17xme+5t6MlSg==",
+ "license": "MIT"
},
- "node_modules/@jest/types/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==",
+ "node_modules/@codingame/monaco-vscode-theme-defaults-default-extension": {
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-theme-defaults-default-extension/-/monaco-vscode-theme-defaults-default-extension-8.0.4.tgz",
+ "integrity": "sha512-y2M0i2ZUGdQbbZ5/rfGQzDe0McUWOVDu0HrIBKhGCyVMfeR7nII06jipQD0e/XPY1cmphyi/x1U70AX2msJEQQ==",
+ "license": "MIT",
+ "dependencies": {
+ "vscode": "npm:@codingame/monaco-vscode-api@8.0.4"
+ }
+ },
+ "node_modules/@codingame/monaco-vscode-theme-defaults-default-extension/node_modules/vscode": {
+ "name": "@codingame/monaco-vscode-api",
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-api/-/monaco-vscode-api-8.0.4.tgz",
+ "integrity": "sha512-qZ+HwIijDvzwwWscMA73y9ARu5zUaENOdzi0jQftJP9j2k96cRghsaCV25OgnmpZ/1BemjB4HhHCcr71Gq+GPQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@codingame/monaco-vscode-base-service-override": "8.0.4",
+ "@codingame/monaco-vscode-environment-service-override": "8.0.4",
+ "@codingame/monaco-vscode-extensions-service-override": "8.0.4",
+ "@codingame/monaco-vscode-files-service-override": "8.0.4",
+ "@codingame/monaco-vscode-host-service-override": "8.0.4",
+ "@codingame/monaco-vscode-layout-service-override": "8.0.4",
+ "@codingame/monaco-vscode-quickaccess-service-override": "8.0.4",
+ "@vscode/iconv-lite-umd": "0.7.0",
+ "jschardet": "3.1.3"
+ }
+ },
+ "node_modules/@codingame/monaco-vscode-theme-service-override": {
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-theme-service-override/-/monaco-vscode-theme-service-override-8.0.4.tgz",
+ "integrity": "sha512-z2UpL7KQJ/gg1LUP9ya65Qph30bypwiQT+mq9ZM699nQEPpXJ9HGA5AiHE2rf2wlKnbkmis1gdpIXeYQsDLy0g==",
+ "license": "MIT",
+ "dependencies": {
+ "@codingame/monaco-vscode-files-service-override": "8.0.4",
+ "vscode": "npm:@codingame/monaco-vscode-api@8.0.4"
+ }
+ },
+ "node_modules/@codingame/monaco-vscode-theme-service-override/node_modules/vscode": {
+ "name": "@codingame/monaco-vscode-api",
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-api/-/monaco-vscode-api-8.0.4.tgz",
+ "integrity": "sha512-qZ+HwIijDvzwwWscMA73y9ARu5zUaENOdzi0jQftJP9j2k96cRghsaCV25OgnmpZ/1BemjB4HhHCcr71Gq+GPQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@codingame/monaco-vscode-base-service-override": "8.0.4",
+ "@codingame/monaco-vscode-environment-service-override": "8.0.4",
+ "@codingame/monaco-vscode-extensions-service-override": "8.0.4",
+ "@codingame/monaco-vscode-files-service-override": "8.0.4",
+ "@codingame/monaco-vscode-host-service-override": "8.0.4",
+ "@codingame/monaco-vscode-layout-service-override": "8.0.4",
+ "@codingame/monaco-vscode-quickaccess-service-override": "8.0.4",
+ "@vscode/iconv-lite-umd": "0.7.0",
+ "jschardet": "3.1.3"
+ }
+ },
+ "node_modules/@colors/colors": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz",
+ "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
"engines": {
- "node": ">=8"
+ "node": ">=0.1.90"
}
},
- "node_modules/@jest/types/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==",
+ "node_modules/@cypress/request": {
+ "version": "3.0.8",
+ "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.8.tgz",
+ "integrity": "sha512-h0NFgh1mJmm1nr4jCwkGHwKneVYKghUyWe6TMNrk0B9zsjAJxpg8C4/+BAcmLgCPa1vj1V8rNUaILl+zYRUWBQ==",
+ "dev": true,
+ "license": "Apache-2.0",
"dependencies": {
- "has-flag": "^4.0.0"
+ "aws-sign2": "~0.7.0",
+ "aws4": "^1.8.0",
+ "caseless": "~0.12.0",
+ "combined-stream": "~1.0.6",
+ "extend": "~3.0.2",
+ "forever-agent": "~0.6.1",
+ "form-data": "~4.0.0",
+ "http-signature": "~1.4.0",
+ "is-typedarray": "~1.0.0",
+ "isstream": "~0.1.2",
+ "json-stringify-safe": "~5.0.1",
+ "mime-types": "~2.1.19",
+ "performance-now": "^2.1.0",
+ "qs": "6.14.0",
+ "safe-buffer": "^5.1.2",
+ "tough-cookie": "^5.0.0",
+ "tunnel-agent": "^0.6.0",
+ "uuid": "^8.3.2"
},
"engines": {
- "node": ">=8"
+ "node": ">= 6"
}
},
- "node_modules/@jridgewell/gen-mapping": {
- "version": "0.3.5",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
- "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
- "license": "MIT",
+ "node_modules/@cypress/request/node_modules/qs": {
+ "version": "6.14.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz",
+ "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==",
+ "dev": true,
+ "license": "BSD-3-Clause",
"dependencies": {
- "@jridgewell/set-array": "^1.2.1",
- "@jridgewell/sourcemap-codec": "^1.4.10",
- "@jridgewell/trace-mapping": "^0.3.24"
+ "side-channel": "^1.1.0"
},
"engines": {
- "node": ">=6.0.0"
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/@jridgewell/resolve-uri": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz",
- "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==",
- "engines": {
- "node": ">=6.0.0"
+ "node_modules/@cypress/request/node_modules/uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist/bin/uuid"
}
},
- "node_modules/@jridgewell/set-array": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
- "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
+ "node_modules/@cypress/xvfb": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz",
+ "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==",
+ "dev": true,
"license": "MIT",
- "engines": {
- "node": ">=6.0.0"
+ "dependencies": {
+ "debug": "^3.1.0",
+ "lodash.once": "^4.1.1"
}
},
- "node_modules/@jridgewell/source-map": {
- "version": "0.3.5",
- "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz",
- "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==",
+ "node_modules/@cypress/xvfb/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@jridgewell/gen-mapping": "^0.3.0",
- "@jridgewell/trace-mapping": "^0.3.9"
+ "ms": "^2.1.1"
}
},
- "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=="
+ "node_modules/@emotion/babel-plugin": {
+ "version": "11.11.0",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.16.7",
+ "@babel/runtime": "^7.18.3",
+ "@emotion/hash": "^0.9.1",
+ "@emotion/memoize": "^0.8.1",
+ "@emotion/serialize": "^1.1.2",
+ "babel-plugin-macros": "^3.1.0",
+ "convert-source-map": "^1.5.0",
+ "escape-string-regexp": "^4.0.0",
+ "find-root": "^1.1.0",
+ "source-map": "^0.5.7",
+ "stylis": "4.2.0"
+ }
},
- "node_modules/@jridgewell/trace-mapping": {
- "version": "0.3.25",
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
- "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
+ "node_modules/@emotion/babel-plugin/node_modules/convert-source-map": {
+ "version": "1.9.0",
+ "license": "MIT"
+ },
+ "node_modules/@emotion/cache": {
+ "version": "11.11.0",
"license": "MIT",
"dependencies": {
- "@jridgewell/resolve-uri": "^3.1.0",
- "@jridgewell/sourcemap-codec": "^1.4.14"
+ "@emotion/memoize": "^0.8.1",
+ "@emotion/sheet": "^1.2.2",
+ "@emotion/utils": "^1.2.1",
+ "@emotion/weak-memoize": "^0.3.1",
+ "stylis": "4.2.0"
}
},
- "node_modules/@leanprover/infoview": {
- "version": "0.4.4",
- "resolved": "https://registry.npmjs.org/@leanprover/infoview/-/infoview-0.4.4.tgz",
- "integrity": "sha512-OxHffFaHcEudLyBEWpicOl7TfXuTYxW5Sz1RkHdUINWJpQsQn60YDF5fNRKmSb0d/fm7p+LVeBvM273jvfR5wQ==",
+ "node_modules/@emotion/hash": {
+ "version": "0.9.1",
+ "license": "MIT"
+ },
+ "node_modules/@emotion/is-prop-valid": {
+ "version": "1.2.1",
+ "license": "MIT",
"dependencies": {
- "@leanprover/infoview-api": "~0.2.1",
- "@vscode/codicons": "^0.0.32",
- "es-module-shims": "^1.6.2",
- "marked": "^4.2.2",
- "react-fast-compare": "^3.2.0",
- "tachyons": "^4.12.0",
- "vscode-languageserver-protocol": "^3.17.2"
+ "@emotion/memoize": "^0.8.1"
}
},
- "node_modules/@leanprover/infoview-api": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/@leanprover/infoview-api/-/infoview-api-0.2.1.tgz",
- "integrity": "sha512-4sYdwOhUsa5wfvo/ZsCbcm8fBWcrATciZq0sWfmi5NRbIyZ+c2QjTm6D9CeYPCNvz9yvD1KBp/2+hKEZ8SOHkA=="
+ "node_modules/@emotion/memoize": {
+ "version": "0.8.1",
+ "license": "MIT"
},
- "node_modules/@mui/base": {
- "version": "5.0.0-beta.34",
- "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.34.tgz",
- "integrity": "sha512-e2mbTGTtReD/y5RFwnhkl1Tgl3XwgJhY040IlfkTVaU9f5LWrVhEnpRsYXu3B1CtLrwiWs4cu7aMHV9yRd4jpw==",
+ "node_modules/@emotion/react": {
+ "version": "11.11.3",
+ "license": "MIT",
"dependencies": {
- "@babel/runtime": "^7.23.9",
- "@floating-ui/react-dom": "^2.0.8",
- "@mui/types": "^7.2.13",
- "@mui/utils": "^5.15.7",
- "@popperjs/core": "^2.11.8",
- "clsx": "^2.1.0",
- "prop-types": "^15.8.1"
- },
- "engines": {
- "node": ">=12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/mui-org"
+ "@babel/runtime": "^7.18.3",
+ "@emotion/babel-plugin": "^11.11.0",
+ "@emotion/cache": "^11.11.0",
+ "@emotion/serialize": "^1.1.3",
+ "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1",
+ "@emotion/utils": "^1.2.1",
+ "@emotion/weak-memoize": "^0.3.1",
+ "hoist-non-react-statics": "^3.3.1"
},
"peerDependencies": {
- "@types/react": "^17.0.0 || ^18.0.0",
- "react": "^17.0.0 || ^18.0.0",
- "react-dom": "^17.0.0 || ^18.0.0"
+ "react": ">=16.8.0"
},
"peerDependenciesMeta": {
"@types/react": {
@@ -2990,1372 +3107,1344 @@
}
}
},
- "node_modules/@mui/core-downloads-tracker": {
- "version": "5.15.8",
- "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.8.tgz",
- "integrity": "sha512-W6R1dZJgbYfLmQKf7Es2WUw0pkDkEVUf2jA22DYu0JOa9M3pjvOqoC9HgOPGNNJTu6SCWLSWh3euv1Jn2NmeQA==",
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/mui-org"
- }
- },
- "node_modules/@mui/icons-material": {
- "version": "5.15.8",
- "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.15.8.tgz",
- "integrity": "sha512-3Ikivf+BOJ7jT1/71HrbKeicgF9ENM4qo+J1050HMJLtLiJEVXbicnsg2oWJZL+0AsrOMaKnTmx1URBpkctLWg==",
+ "node_modules/@emotion/serialize": {
+ "version": "1.1.3",
+ "license": "MIT",
"dependencies": {
- "@babel/runtime": "^7.23.9"
- },
- "engines": {
- "node": ">=12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/mui-org"
- },
- "peerDependencies": {
- "@mui/material": "^5.0.0",
- "@types/react": "^17.0.0 || ^18.0.0",
- "react": "^17.0.0 || ^18.0.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
+ "@emotion/hash": "^0.9.1",
+ "@emotion/memoize": "^0.8.1",
+ "@emotion/unitless": "^0.8.1",
+ "@emotion/utils": "^1.2.1",
+ "csstype": "^3.0.2"
}
},
- "node_modules/@mui/material": {
- "version": "5.15.7",
- "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.15.7.tgz",
- "integrity": "sha512-l6+AiKZH3iOJmZCnlpel8ghYQe9Lq0BEuKP8fGj3g5xz4arO9GydqYAtLPMvuHKtArj8lJGNuT2yHYxmejincA==",
+ "node_modules/@emotion/sheet": {
+ "version": "1.2.2",
+ "license": "MIT"
+ },
+ "node_modules/@emotion/styled": {
+ "version": "11.11.0",
+ "license": "MIT",
"dependencies": {
- "@babel/runtime": "^7.23.9",
- "@mui/base": "5.0.0-beta.34",
- "@mui/core-downloads-tracker": "^5.15.7",
- "@mui/system": "^5.15.7",
- "@mui/types": "^7.2.13",
- "@mui/utils": "^5.15.7",
- "@types/react-transition-group": "^4.4.10",
- "clsx": "^2.1.0",
- "csstype": "^3.1.2",
- "prop-types": "^15.8.1",
- "react-is": "^18.2.0",
- "react-transition-group": "^4.4.5"
- },
- "engines": {
- "node": ">=12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/mui-org"
+ "@babel/runtime": "^7.18.3",
+ "@emotion/babel-plugin": "^11.11.0",
+ "@emotion/is-prop-valid": "^1.2.1",
+ "@emotion/serialize": "^1.1.2",
+ "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1",
+ "@emotion/utils": "^1.2.1"
},
"peerDependencies": {
- "@emotion/react": "^11.5.0",
- "@emotion/styled": "^11.3.0",
- "@types/react": "^17.0.0 || ^18.0.0",
- "react": "^17.0.0 || ^18.0.0",
- "react-dom": "^17.0.0 || ^18.0.0"
+ "@emotion/react": "^11.0.0-rc.0",
+ "react": ">=16.8.0"
},
"peerDependenciesMeta": {
- "@emotion/react": {
- "optional": true
- },
- "@emotion/styled": {
- "optional": true
- },
"@types/react": {
"optional": true
}
}
},
- "node_modules/@mui/private-theming": {
- "version": "5.15.8",
- "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.15.8.tgz",
- "integrity": "sha512-HMDPO416iMZPqs8nGUL3GJMDNpJtE1Uefw/Aw+zTKJHX5JnT+Bms41e2065BUT/zR5dYcKjFP4gQMwW5QX7nvA==",
- "dependencies": {
- "@babel/runtime": "^7.23.9",
- "@mui/utils": "^5.15.8",
- "prop-types": "^15.8.1"
- },
- "engines": {
- "node": ">=12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/mui-org"
- },
+ "node_modules/@emotion/unitless": {
+ "version": "0.8.1",
+ "license": "MIT"
+ },
+ "node_modules/@emotion/use-insertion-effect-with-fallbacks": {
+ "version": "1.0.1",
+ "license": "MIT",
"peerDependencies": {
- "@types/react": "^17.0.0 || ^18.0.0",
- "react": "^17.0.0 || ^18.0.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
+ "react": ">=16.8.0"
}
},
- "node_modules/@mui/styled-engine": {
- "version": "5.15.8",
- "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.15.8.tgz",
- "integrity": "sha512-31ZKPGsS0OiSwuzi8RWoTiWRdUWXPRiOQkyG9bRYX/zvoYeBXEdbsLEgbryug5mVRsPpvwbH5q/i/t6MkjQ71g==",
- "dependencies": {
- "@babel/runtime": "^7.23.9",
- "@emotion/cache": "^11.11.0",
- "csstype": "^3.1.2",
- "prop-types": "^15.8.1"
- },
+ "node_modules/@emotion/utils": {
+ "version": "1.2.1",
+ "license": "MIT"
+ },
+ "node_modules/@emotion/weak-memoize": {
+ "version": "0.3.1",
+ "license": "MIT"
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.25.0",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": ">=12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/mui-org"
- },
- "peerDependencies": {
- "@emotion/react": "^11.4.1",
- "@emotion/styled": "^11.3.0",
- "react": "^17.0.0 || ^18.0.0"
- },
- "peerDependenciesMeta": {
- "@emotion/react": {
- "optional": true
- },
- "@emotion/styled": {
- "optional": true
- }
+ "node": ">=18"
}
},
- "node_modules/@mui/system": {
- "version": "5.15.8",
- "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.15.8.tgz",
- "integrity": "sha512-BUMJvlz1UqIqDPyrvc+MwjOUkWKskUPAOUuRh2KMAworiXuuUmtIivxSfdGll2ex6RHSylu4yc5dJZByOI8EcQ==",
+ "node_modules/@floating-ui/core": {
+ "version": "1.6.0",
+ "license": "MIT",
"dependencies": {
- "@babel/runtime": "^7.23.9",
- "@mui/private-theming": "^5.15.8",
- "@mui/styled-engine": "^5.15.8",
- "@mui/types": "^7.2.13",
- "@mui/utils": "^5.15.8",
- "clsx": "^2.1.0",
- "csstype": "^3.1.2",
- "prop-types": "^15.8.1"
- },
- "engines": {
- "node": ">=12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/mui-org"
- },
- "peerDependencies": {
- "@emotion/react": "^11.5.0",
- "@emotion/styled": "^11.3.0",
- "@types/react": "^17.0.0 || ^18.0.0",
- "react": "^17.0.0 || ^18.0.0"
- },
- "peerDependenciesMeta": {
- "@emotion/react": {
- "optional": true
- },
- "@emotion/styled": {
- "optional": true
- },
- "@types/react": {
- "optional": true
- }
+ "@floating-ui/utils": "^0.2.1"
}
},
- "node_modules/@mui/types": {
- "version": "7.2.13",
- "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.13.tgz",
- "integrity": "sha512-qP9OgacN62s+l8rdDhSFRe05HWtLLJ5TGclC9I1+tQngbssu0m2dmFZs+Px53AcOs9fD7TbYd4gc9AXzVqO/+g==",
- "peerDependencies": {
- "@types/react": "^17.0.0 || ^18.0.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
+ "node_modules/@floating-ui/dom": {
+ "version": "1.6.1",
+ "license": "MIT",
+ "dependencies": {
+ "@floating-ui/core": "^1.6.0",
+ "@floating-ui/utils": "^0.2.1"
}
},
- "node_modules/@mui/utils": {
- "version": "5.15.8",
- "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.15.8.tgz",
- "integrity": "sha512-Q6Z/xSxi1Z6xQ5Qj9p4ZTHudwfrrwFALtU6H1O222pXudg9Qm0zHdiwJQiHT9L6jMIN78ZujEfGHserMoHUrQw==",
+ "node_modules/@floating-ui/react": {
+ "version": "0.27.12",
+ "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.27.12.tgz",
+ "integrity": "sha512-kKlWNrpIQxF1B/a2MZvE0/uyKby4960yjO91W7nVyNKmmfNi62xU9HCjL1M1eWzx/LFj/VPSwJVbwQk9Pq/68A==",
+ "license": "MIT",
"dependencies": {
- "@babel/runtime": "^7.23.9",
- "@types/prop-types": "^15.7.11",
- "prop-types": "^15.8.1",
- "react-is": "^18.2.0"
- },
- "engines": {
- "node": ">=12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/mui-org"
+ "@floating-ui/react-dom": "^2.1.3",
+ "@floating-ui/utils": "^0.2.9",
+ "tabbable": "^6.0.0"
},
"peerDependencies": {
- "@types/react": "^17.0.0 || ^18.0.0",
- "react": "^17.0.0 || ^18.0.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
+ "react": ">=17.0.0",
+ "react-dom": ">=17.0.0"
}
},
- "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==",
+ "node_modules/@floating-ui/react-dom": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.3.tgz",
+ "integrity": "sha512-huMBfiU9UnQ2oBwIhgzyIiSpVgvlDstU8CX0AF+wS+KzmYMs0J2a3GwuFHV1Lz+jlrQGeC1fF+Nv0QoumyV0bA==",
"license": "MIT",
"dependencies": {
- "@nodelib/fs.stat": "2.0.5",
- "run-parallel": "^1.1.9"
+ "@floating-ui/dom": "^1.0.0"
},
- "engines": {
- "node": ">= 8"
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0"
}
},
- "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==",
+ "node_modules/@floating-ui/utils": {
+ "version": "0.2.9",
+ "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.9.tgz",
+ "integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==",
+ "license": "MIT"
+ },
+ "node_modules/@fontsource/roboto": {
+ "version": "4.5.8",
+ "license": "MIT"
+ },
+ "node_modules/@fontsource/roboto-mono": {
+ "version": "4.5.10",
+ "license": "MIT"
+ },
+ "node_modules/@fortawesome/fontawesome-common-types": {
+ "version": "6.5.1",
+ "hasInstallScript": true,
"license": "MIT",
"engines": {
- "node": ">= 8"
+ "node": ">=6"
}
},
- "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==",
+ "node_modules/@fortawesome/fontawesome-svg-core": {
+ "version": "6.5.1",
+ "hasInstallScript": true,
"license": "MIT",
"dependencies": {
- "@nodelib/fs.scandir": "2.1.5",
- "fastq": "^1.6.0"
+ "@fortawesome/fontawesome-common-types": "6.5.1"
},
"engines": {
- "node": ">= 8"
+ "node": ">=6"
}
},
- "node_modules/@octokit/app": {
- "version": "15.1.5",
- "resolved": "https://registry.npmjs.org/@octokit/app/-/app-15.1.5.tgz",
- "integrity": "sha512-6cxLT9U8x7GGQ7lNWsKtFr4ccg9oLkGvowk373sX9HvX5U37kql5d55SzaQUxPE8PwgX2cqkzDm5NF5aPKevqg==",
- "license": "MIT",
+ "node_modules/@fortawesome/free-regular-svg-icons": {
+ "version": "6.5.1",
+ "hasInstallScript": true,
+ "license": "(CC-BY-4.0 AND MIT)",
"dependencies": {
- "@octokit/auth-app": "^7.1.5",
- "@octokit/auth-unauthenticated": "^6.1.2",
- "@octokit/core": "^6.1.4",
- "@octokit/oauth-app": "^7.1.6",
- "@octokit/plugin-paginate-rest": "^11.4.2",
- "@octokit/types": "^13.8.0",
- "@octokit/webhooks": "^13.6.1"
+ "@fortawesome/fontawesome-common-types": "6.5.1"
},
"engines": {
- "node": ">= 18"
+ "node": ">=6"
}
},
- "node_modules/@octokit/auth-app": {
- "version": "7.1.5",
- "resolved": "https://registry.npmjs.org/@octokit/auth-app/-/auth-app-7.1.5.tgz",
- "integrity": "sha512-boklS4E6LpbA3nRx+SU2fRKRGZJdOGoSZne/i3Y0B5rfHOcGwFgcXrwDLdtbv4igfDSnAkZaoNBv1GYjPDKRNw==",
- "license": "MIT",
+ "node_modules/@fortawesome/free-solid-svg-icons": {
+ "version": "6.5.1",
+ "hasInstallScript": true,
+ "license": "(CC-BY-4.0 AND MIT)",
"dependencies": {
- "@octokit/auth-oauth-app": "^8.1.3",
- "@octokit/auth-oauth-user": "^5.1.3",
- "@octokit/request": "^9.2.1",
- "@octokit/request-error": "^6.1.7",
- "@octokit/types": "^13.8.0",
- "toad-cache": "^3.7.0",
- "universal-github-app-jwt": "^2.2.0",
- "universal-user-agent": "^7.0.0"
+ "@fortawesome/fontawesome-common-types": "6.5.1"
},
"engines": {
- "node": ">= 18"
+ "node": ">=6"
}
},
- "node_modules/@octokit/auth-oauth-app": {
- "version": "8.1.3",
- "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-app/-/auth-oauth-app-8.1.3.tgz",
- "integrity": "sha512-4e6OjVe5rZ8yBe8w7byBjpKtSXFuro7gqeGAAZc7QYltOF8wB93rJl2FE0a4U1Mt88xxPv/mS+25/0DuLk0Ewg==",
+ "node_modules/@fortawesome/react-fontawesome": {
+ "version": "0.2.0",
"license": "MIT",
"dependencies": {
- "@octokit/auth-oauth-device": "^7.1.3",
- "@octokit/auth-oauth-user": "^5.1.3",
- "@octokit/request": "^9.2.1",
- "@octokit/types": "^13.6.2",
- "universal-user-agent": "^7.0.0"
+ "prop-types": "^15.8.1"
},
- "engines": {
- "node": ">= 18"
+ "peerDependencies": {
+ "@fortawesome/fontawesome-svg-core": "~1 || ~6",
+ "react": ">=16.3"
}
},
- "node_modules/@octokit/auth-oauth-device": {
- "version": "7.1.3",
- "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-device/-/auth-oauth-device-7.1.3.tgz",
- "integrity": "sha512-BECO/N4B/Uikj0w3GCvjf/odMujtYTP3q82BJSjxC2J3rxTEiZIJ+z2xnRlDb0IE9dQSaTgRqUPVOieSbFcVzg==",
+ "node_modules/@gulpjs/to-absolute-glob": {
+ "version": "4.0.0",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "@octokit/oauth-methods": "^5.1.4",
- "@octokit/request": "^9.2.1",
- "@octokit/types": "^13.6.2",
- "universal-user-agent": "^7.0.0"
+ "is-negated-glob": "^1.0.0"
},
"engines": {
- "node": ">= 18"
+ "node": ">=10.13.0"
}
},
- "node_modules/@octokit/auth-oauth-user": {
- "version": "5.1.3",
- "resolved": "https://registry.npmjs.org/@octokit/auth-oauth-user/-/auth-oauth-user-5.1.3.tgz",
- "integrity": "sha512-zNPByPn9K7TC+OOHKGxU+MxrE9SZAN11UHYEFLsK2NRn3akJN2LHRl85q+Eypr3tuB2GrKx3rfj2phJdkYCvzw==",
- "license": "MIT",
+ "node_modules/@hapi/hoek": {
+ "version": "9.3.0",
+ "devOptional": true,
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@hapi/topo": {
+ "version": "5.1.0",
+ "devOptional": true,
+ "license": "BSD-3-Clause",
"dependencies": {
- "@octokit/auth-oauth-device": "^7.1.3",
- "@octokit/oauth-methods": "^5.1.3",
- "@octokit/request": "^9.2.1",
- "@octokit/types": "^13.6.2",
- "universal-user-agent": "^7.0.0"
- },
- "engines": {
- "node": ">= 18"
+ "@hapi/hoek": "^9.0.0"
}
},
- "node_modules/@octokit/auth-token": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-5.1.2.tgz",
- "integrity": "sha512-JcQDsBdg49Yky2w2ld20IHAlwr8d/d8N6NiOXbtuoPCqzbsiJgF633mVUw3x4mo0H5ypataQIX7SFu3yy44Mpw==",
+ "node_modules/@jest/create-cache-key-function": {
+ "version": "29.7.0",
"license": "MIT",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@jest/types": "^29.6.3"
+ },
"engines": {
- "node": ">= 18"
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/@octokit/auth-unauthenticated": {
- "version": "6.1.2",
- "resolved": "https://registry.npmjs.org/@octokit/auth-unauthenticated/-/auth-unauthenticated-6.1.2.tgz",
- "integrity": "sha512-07DlUGcz/AAVdzu3EYfi/dOyMSHp9YsOxPl/MPmtlVXWiD//GlV8HgZsPhud94DEyx+RfrW0wSl46Lx+AWbOlg==",
+ "node_modules/@jest/environment": {
+ "version": "29.7.0",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
- "@octokit/request-error": "^6.1.7",
- "@octokit/types": "^13.6.2"
+ "@jest/fake-timers": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "jest-mock": "^29.7.0"
},
"engines": {
- "node": ">= 18"
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/@octokit/core": {
- "version": "6.1.4",
- "resolved": "https://registry.npmjs.org/@octokit/core/-/core-6.1.4.tgz",
- "integrity": "sha512-lAS9k7d6I0MPN+gb9bKDt7X8SdxknYqAMh44S5L+lNqIN2NuV8nvv3g8rPp7MuRxcOpxpUIATWprO0C34a8Qmg==",
+ "node_modules/@jest/fake-timers": {
+ "version": "29.7.0",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
- "@octokit/auth-token": "^5.0.0",
- "@octokit/graphql": "^8.1.2",
- "@octokit/request": "^9.2.1",
- "@octokit/request-error": "^6.1.7",
- "@octokit/types": "^13.6.2",
- "before-after-hook": "^3.0.2",
- "universal-user-agent": "^7.0.0"
+ "@jest/types": "^29.6.3",
+ "@sinonjs/fake-timers": "^10.0.2",
+ "@types/node": "*",
+ "jest-message-util": "^29.7.0",
+ "jest-mock": "^29.7.0",
+ "jest-util": "^29.7.0"
},
"engines": {
- "node": ">= 18"
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/@octokit/endpoint": {
- "version": "10.1.3",
- "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.3.tgz",
- "integrity": "sha512-nBRBMpKPhQUxCsQQeW+rCJ/OPSMcj3g0nfHn01zGYZXuNDvvXudF/TYY6APj5THlurerpFN4a/dQAIAaM6BYhA==",
+ "node_modules/@jest/schemas": {
+ "version": "29.6.3",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
- "@octokit/types": "^13.6.2",
- "universal-user-agent": "^7.0.2"
+ "@sinclair/typebox": "^0.27.8"
},
"engines": {
- "node": ">= 18"
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/@octokit/graphql": {
- "version": "8.2.1",
- "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-8.2.1.tgz",
- "integrity": "sha512-n57hXtOoHrhwTWdvhVkdJHdhTv0JstjDbDRhJfwIRNfFqmSo1DaK/mD2syoNUoLCyqSjBpGAKOG0BuwF392slw==",
+ "node_modules/@jest/types": {
+ "version": "29.6.3",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
- "@octokit/request": "^9.2.2",
- "@octokit/types": "^13.8.0",
- "universal-user-agent": "^7.0.0"
+ "@jest/schemas": "^29.6.3",
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^17.0.8",
+ "chalk": "^4.0.0"
},
"engines": {
- "node": ">= 18"
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/@octokit/oauth-app": {
- "version": "7.1.6",
- "resolved": "https://registry.npmjs.org/@octokit/oauth-app/-/oauth-app-7.1.6.tgz",
- "integrity": "sha512-OMcMzY2WFARg80oJNFwWbY51TBUfLH4JGTy119cqiDawSFXSIBujxmpXiKbGWQlvfn0CxE6f7/+c6+Kr5hI2YA==",
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.5",
"license": "MIT",
"dependencies": {
- "@octokit/auth-oauth-app": "^8.1.3",
- "@octokit/auth-oauth-user": "^5.1.3",
- "@octokit/auth-unauthenticated": "^6.1.2",
- "@octokit/core": "^6.1.4",
- "@octokit/oauth-authorization-url": "^7.1.1",
- "@octokit/oauth-methods": "^5.1.4",
- "@types/aws-lambda": "^8.10.83",
- "universal-user-agent": "^7.0.0"
+ "@jridgewell/set-array": "^1.2.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.24"
},
"engines": {
- "node": ">= 18"
+ "node": ">=6.0.0"
}
},
- "node_modules/@octokit/oauth-authorization-url": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/@octokit/oauth-authorization-url/-/oauth-authorization-url-7.1.1.tgz",
- "integrity": "sha512-ooXV8GBSabSWyhLUowlMIVd9l1s2nsOGQdlP2SQ4LnkEsGXzeCvbSbCPdZThXhEFzleGPwbapT0Sb+YhXRyjCA==",
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.1",
"license": "MIT",
"engines": {
- "node": ">= 18"
+ "node": ">=6.0.0"
}
},
- "node_modules/@octokit/oauth-methods": {
- "version": "5.1.4",
- "resolved": "https://registry.npmjs.org/@octokit/oauth-methods/-/oauth-methods-5.1.4.tgz",
- "integrity": "sha512-Jc/ycnePClOvO1WL7tlC+TRxOFtyJBGuTDsL4dzXNiVZvzZdrPuNw7zHI3qJSUX2n6RLXE5L0SkFmYyNaVUFoQ==",
+ "node_modules/@jridgewell/set-array": {
+ "version": "1.2.1",
"license": "MIT",
- "dependencies": {
- "@octokit/oauth-authorization-url": "^7.0.0",
- "@octokit/request": "^9.2.1",
- "@octokit/request-error": "^6.1.7",
- "@octokit/types": "^13.6.2"
- },
"engines": {
- "node": ">= 18"
+ "node": ">=6.0.0"
}
},
- "node_modules/@octokit/openapi-types": {
- "version": "23.0.1",
- "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-23.0.1.tgz",
- "integrity": "sha512-izFjMJ1sir0jn0ldEKhZ7xegCTj/ObmEDlEfpFrx4k/JyZSMRHbO3/rBwgE7f3m2DHt+RrNGIVw4wSmwnm3t/g==",
- "license": "MIT"
+ "node_modules/@jridgewell/source-map": {
+ "version": "0.3.5",
+ "devOptional": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.0",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ }
},
- "node_modules/@octokit/openapi-webhooks-types": {
- "version": "10.1.1",
- "resolved": "https://registry.npmjs.org/@octokit/openapi-webhooks-types/-/openapi-webhooks-types-10.1.1.tgz",
- "integrity": "sha512-qBfqQVIDQaCFeGCofXieJDwvXcGgDn17+UwZ6WW6lfEvGYGreLFzTiaz9xjet9Us4zDf8iasoW3ixUj/R5lMhA==",
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
+ "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
"license": "MIT"
},
- "node_modules/@octokit/plugin-paginate-graphql": {
- "version": "5.2.4",
- "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-graphql/-/plugin-paginate-graphql-5.2.4.tgz",
- "integrity": "sha512-pLZES1jWaOynXKHOqdnwZ5ULeVR6tVVCMm+AUbp0htdcyXDU95WbkYdU4R2ej1wKj5Tu94Mee2Ne0PjPO9cCyA==",
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.25",
"license": "MIT",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@jsonjoy.com/base64": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz",
+ "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==",
+ "license": "Apache-2.0",
"engines": {
- "node": ">= 18"
+ "node": ">=10.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/streamich"
},
"peerDependencies": {
- "@octokit/core": ">=6"
+ "tslib": "2"
}
},
- "node_modules/@octokit/plugin-paginate-rest": {
- "version": "11.4.3",
- "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.4.3.tgz",
- "integrity": "sha512-tBXaAbXkqVJlRoA/zQVe9mUdb8rScmivqtpv3ovsC5xhje/a+NOCivs7eUhWBwCApJVsR4G5HMeaLbq7PxqZGA==",
- "license": "MIT",
+ "node_modules/@jsonjoy.com/json-pack": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.2.0.tgz",
+ "integrity": "sha512-io1zEbbYcElht3tdlqEOFxZ0dMTYrHz9iMf0gqn1pPjZFTCgM5R4R5IMA20Chb2UPYYsxjzs8CgZ7Nb5n2K2rA==",
+ "license": "Apache-2.0",
"dependencies": {
- "@octokit/types": "^13.7.0"
+ "@jsonjoy.com/base64": "^1.1.1",
+ "@jsonjoy.com/util": "^1.1.2",
+ "hyperdyperid": "^1.2.0",
+ "thingies": "^1.20.0"
},
"engines": {
- "node": ">= 18"
+ "node": ">=10.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/streamich"
},
"peerDependencies": {
- "@octokit/core": ">=6"
+ "tslib": "2"
}
},
- "node_modules/@octokit/plugin-rest-endpoint-methods": {
- "version": "13.3.1",
- "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.3.1.tgz",
- "integrity": "sha512-o8uOBdsyR+WR8MK9Cco8dCgvG13H1RlM1nWnK/W7TEACQBFux/vPREgKucxUfuDQ5yi1T3hGf4C5ZmZXAERgwQ==",
- "license": "MIT",
- "dependencies": {
- "@octokit/types": "^13.8.0"
- },
+ "node_modules/@jsonjoy.com/util": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.6.0.tgz",
+ "integrity": "sha512-sw/RMbehRhN68WRtcKCpQOPfnH6lLP4GJfqzi3iYej8tnzpZUDr6UkZYJjcjjC0FWEJOJbyM3PTIwxucUmDG2A==",
+ "license": "Apache-2.0",
"engines": {
- "node": ">= 18"
+ "node": ">=10.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/streamich"
},
"peerDependencies": {
- "@octokit/core": ">=6"
+ "tslib": "2"
}
},
- "node_modules/@octokit/plugin-retry": {
- "version": "7.1.4",
- "resolved": "https://registry.npmjs.org/@octokit/plugin-retry/-/plugin-retry-7.1.4.tgz",
- "integrity": "sha512-7AIP4p9TttKN7ctygG4BtR7rrB0anZqoU9ThXFk8nETqIfvgPUANTSYHqWYknK7W3isw59LpZeLI8pcEwiJdRg==",
- "license": "MIT",
+ "node_modules/@leanprover/infoview": {
+ "version": "0.8.5",
+ "resolved": "https://registry.npmjs.org/@leanprover/infoview/-/infoview-0.8.5.tgz",
+ "integrity": "sha512-cNblrv7HE5MBxVUvD8bdeb/5Wn8wg/r37UMQ09AYhWx7P7NkCc95MkP1UMj62yTF/1GTCSxeoEQM8mFWAKtMog==",
+ "license": "Apache-2.0",
"dependencies": {
- "@octokit/request-error": "^6.1.7",
- "@octokit/types": "^13.6.2",
- "bottleneck": "^2.15.3"
- },
- "engines": {
- "node": ">= 18"
- },
- "peerDependencies": {
- "@octokit/core": ">=6"
+ "@leanprover/infoview-api": "~0.7.0",
+ "@vscode-elements/react-elements": "^0.5.0",
+ "@vscode/codicons": "^0.0.32",
+ "es-module-lexer": "^1.5.4",
+ "es-module-shims": "^1.7.3",
+ "react-fast-compare": "^3.2.2",
+ "tachyons": "^4.12.0",
+ "vscode-languageserver-protocol": "^3.17.3"
}
},
- "node_modules/@octokit/plugin-throttling": {
- "version": "9.4.0",
- "resolved": "https://registry.npmjs.org/@octokit/plugin-throttling/-/plugin-throttling-9.4.0.tgz",
- "integrity": "sha512-IOlXxXhZA4Z3m0EEYtrrACkuHiArHLZ3CvqWwOez/pURNqRuwfoFlTPbN5Muf28pzFuztxPyiUiNwz8KctdZaQ==",
- "license": "MIT",
+ "node_modules/@leanprover/infoview-api": {
+ "version": "0.2.1",
+ "license": "Apache-2.0"
+ },
+ "node_modules/@leanprover/infoview/node_modules/@leanprover/infoview-api": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/@leanprover/infoview-api/-/infoview-api-0.7.0.tgz",
+ "integrity": "sha512-2h6c+VWxu9MV1CKternaoFzoaXI6qQAOAzsGiqw/10e3koG5BpX8Rz7N6uQntB1/Y45HQQo6r2ztoODjttjkZg==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/@leanprover/unicode-input": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/@leanprover/unicode-input/-/unicode-input-0.1.4.tgz",
+ "integrity": "sha512-4nUEw54HKJvNbfzdRRwD0uaMRM3bLUeRNCMP99m+kmQjMawcLAZqSrislcrg5vAdkHw4/A2540BDBeKyusVL7Q==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/@leanprover/unicode-input-component": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/@leanprover/unicode-input-component/-/unicode-input-component-0.1.4.tgz",
+ "integrity": "sha512-4JagUtwmj8jtfcEhZGd3PgBuCMgDVvgLXiEMBOsg4cOOiez7MfYFxqu/V0oViDiKvmsj1yyQbiN9vLdRGXUytQ==",
+ "license": "Apache-2.0",
"dependencies": {
- "@octokit/types": "^13.7.0",
- "bottleneck": "^2.15.3"
- },
- "engines": {
- "node": ">= 18"
- },
- "peerDependencies": {
- "@octokit/core": "^6.1.3"
+ "@leanprover/unicode-input": "^0.1.4"
}
},
- "node_modules/@octokit/request": {
- "version": "9.2.2",
- "resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.2.2.tgz",
- "integrity": "sha512-dZl0ZHx6gOQGcffgm1/Sf6JfEpmh34v3Af2Uci02vzUYz6qEN6zepoRtmybWXIGXFIK8K9ylE3b+duCWqhArtg==",
- "license": "MIT",
- "dependencies": {
- "@octokit/endpoint": "^10.1.3",
- "@octokit/request-error": "^6.1.7",
- "@octokit/types": "^13.6.2",
- "fast-content-type-parse": "^2.0.0",
- "universal-user-agent": "^7.0.2"
- },
- "engines": {
- "node": ">= 18"
+ "node_modules/@lit-labs/ssr-dom-shim": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.3.0.tgz",
+ "integrity": "sha512-nQIWonJ6eFAvUUrSlwyHDm/aE8PBDu5kRpL0vHMg6K8fK3Diq1xdPjTnsJSwxABhaZ+5eBi1btQB5ShUTKo4nQ==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@lit/react": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/@lit/react/-/react-1.0.7.tgz",
+ "integrity": "sha512-cencnwwLXQKiKxjfFzSgZRngcWJzUDZi/04E0fSaF86wZgchMdvTyu+lE36DrUfvuus3bH8+xLPrhM1cTjwpzw==",
+ "license": "BSD-3-Clause",
+ "peerDependencies": {
+ "@types/react": "17 || 18 || 19"
}
},
- "node_modules/@octokit/request-error": {
- "version": "6.1.7",
- "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.7.tgz",
- "integrity": "sha512-69NIppAwaauwZv6aOzb+VVLwt+0havz9GT5YplkeJv7fG7a40qpLt/yZKyiDxAhgz0EtgNdNcb96Z0u+Zyuy2g==",
- "license": "MIT",
+ "node_modules/@lit/reactive-element": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-2.1.0.tgz",
+ "integrity": "sha512-L2qyoZSQClcBmq0qajBVbhYEcG6iK0XfLn66ifLe/RfC0/ihpc+pl0Wdn8bJ8o+hj38cG0fGXRgSS20MuXn7qA==",
+ "license": "BSD-3-Clause",
"dependencies": {
- "@octokit/types": "^13.6.2"
- },
- "engines": {
- "node": ">= 18"
+ "@lit-labs/ssr-dom-shim": "^1.2.0"
}
},
- "node_modules/@octokit/types": {
- "version": "13.8.0",
- "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.8.0.tgz",
- "integrity": "sha512-x7DjTIbEpEWXK99DMd01QfWy0hd5h4EN+Q7shkdKds3otGQP+oWE/y0A76i1OvH9fygo4ddvNf7ZvF0t78P98A==",
+ "node_modules/@microsoft/fast-element": {
+ "version": "1.14.0",
+ "resolved": "https://registry.npmjs.org/@microsoft/fast-element/-/fast-element-1.14.0.tgz",
+ "integrity": "sha512-zXvuSOzvsu8zDTy9eby8ix8VqLop2rwKRgp++ZN2kTCsoB3+QJVoaGD2T/Cyso2ViZQFXNpiNCVKfnmxBvmWkQ==",
+ "license": "MIT"
+ },
+ "node_modules/@microsoft/fast-foundation": {
+ "version": "2.50.0",
+ "resolved": "https://registry.npmjs.org/@microsoft/fast-foundation/-/fast-foundation-2.50.0.tgz",
+ "integrity": "sha512-8mFYG88Xea1jZf2TI9Lm/jzZ6RWR8x29r24mGuLojNYqIR2Bl8+hnswoV6laApKdCbGMPKnsAL/O68Q0sRxeVg==",
"license": "MIT",
"dependencies": {
- "@octokit/openapi-types": "^23.0.1"
+ "@microsoft/fast-element": "^1.14.0",
+ "@microsoft/fast-web-utilities": "^5.4.1",
+ "tabbable": "^5.2.0",
+ "tslib": "^1.13.0"
}
},
- "node_modules/@octokit/webhooks": {
- "version": "13.7.4",
- "resolved": "https://registry.npmjs.org/@octokit/webhooks/-/webhooks-13.7.4.tgz",
- "integrity": "sha512-f386XyLTieQbgKPKS6ZMlH4dq8eLsxNddwofiKRZCq0bZ2gikoFwMD99K6l1oAwqe/KZNzrEziGicRgnzplplQ==",
+ "node_modules/@microsoft/fast-foundation/node_modules/tabbable": {
+ "version": "5.3.3",
+ "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-5.3.3.tgz",
+ "integrity": "sha512-QD9qKY3StfbZqWOPLp0++pOrAVb/HbUi5xCc8cUo4XjP19808oaMiDzn0leBY5mCespIBM0CIZePzZjgzR83kA==",
+ "license": "MIT"
+ },
+ "node_modules/@microsoft/fast-foundation/node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+ "license": "0BSD"
+ },
+ "node_modules/@microsoft/fast-react-wrapper": {
+ "version": "0.3.25",
+ "resolved": "https://registry.npmjs.org/@microsoft/fast-react-wrapper/-/fast-react-wrapper-0.3.25.tgz",
+ "integrity": "sha512-jKzmk2xJV93RL/jEFXEZgBvXlKIY4N4kXy3qrjmBfFpqNi3VjY+oUTWyMnHRMC5EUhIFxD+Y1VD4u9uIPX3jQw==",
"license": "MIT",
"dependencies": {
- "@octokit/openapi-webhooks-types": "10.1.1",
- "@octokit/request-error": "^6.1.7",
- "@octokit/webhooks-methods": "^5.1.1"
+ "@microsoft/fast-element": "^1.14.0",
+ "@microsoft/fast-foundation": "^2.50.0"
},
- "engines": {
- "node": ">= 18"
+ "peerDependencies": {
+ "react": ">=16.9.0"
}
},
- "node_modules/@octokit/webhooks-methods": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/@octokit/webhooks-methods/-/webhooks-methods-5.1.1.tgz",
- "integrity": "sha512-NGlEHZDseJTCj8TMMFehzwa9g7On4KJMPVHDSrHxCQumL6uSQR8wIkP/qesv52fXqV1BPf4pTxwtS31ldAt9Xg==",
+ "node_modules/@microsoft/fast-web-utilities": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/@microsoft/fast-web-utilities/-/fast-web-utilities-5.4.1.tgz",
+ "integrity": "sha512-ReWYncndjV3c8D8iq9tp7NcFNc1vbVHvcBFPME2nNFKNbS1XCesYZGlIlf3ot5EmuOXPlrzUHOWzQ2vFpIkqDg==",
"license": "MIT",
- "engines": {
- "node": ">= 18"
+ "dependencies": {
+ "exenv-es6": "^1.1.1"
}
},
- "node_modules/@pmmmwh/react-refresh-webpack-plugin": {
- "version": "0.5.11",
- "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.11.tgz",
- "integrity": "sha512-7j/6vdTym0+qZ6u4XbSAxrWBGYSdCfTzySkj7WAFgDLmSyWlOrWvpyzxlFh5jtw9dn0oL/jtW+06XfFiisN3JQ==",
- "dev": true,
+ "node_modules/@mui/base": {
+ "version": "5.0.0-beta.34",
+ "license": "MIT",
"dependencies": {
- "ansi-html-community": "^0.0.8",
- "common-path-prefix": "^3.0.0",
- "core-js-pure": "^3.23.3",
- "error-stack-parser": "^2.0.6",
- "find-up": "^5.0.0",
- "html-entities": "^2.1.0",
- "loader-utils": "^2.0.4",
- "schema-utils": "^3.0.0",
- "source-map": "^0.7.3"
+ "@babel/runtime": "^7.23.9",
+ "@floating-ui/react-dom": "^2.0.8",
+ "@mui/types": "^7.2.13",
+ "@mui/utils": "^5.15.7",
+ "@popperjs/core": "^2.11.8",
+ "clsx": "^2.1.0",
+ "prop-types": "^15.8.1"
},
"engines": {
- "node": ">= 10.13"
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui-org"
},
"peerDependencies": {
- "@types/webpack": "4.x || 5.x",
- "react-refresh": ">=0.10.0 <1.0.0",
- "sockjs-client": "^1.4.0",
- "type-fest": ">=0.17.0 <5.0.0",
- "webpack": ">=4.43.0 <6.0.0",
- "webpack-dev-server": "3.x || 4.x",
- "webpack-hot-middleware": "2.x",
- "webpack-plugin-serve": "0.x || 1.x"
+ "@types/react": "^17.0.0 || ^18.0.0",
+ "react": "^17.0.0 || ^18.0.0",
+ "react-dom": "^17.0.0 || ^18.0.0"
},
"peerDependenciesMeta": {
- "@types/webpack": {
- "optional": true
- },
- "sockjs-client": {
- "optional": true
- },
- "type-fest": {
- "optional": true
- },
- "webpack-dev-server": {
- "optional": true
- },
- "webpack-hot-middleware": {
- "optional": true
- },
- "webpack-plugin-serve": {
+ "@types/react": {
"optional": true
}
}
},
- "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/source-map": {
- "version": "0.7.4",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
- "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==",
- "dev": true,
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@popperjs/core": {
- "version": "2.11.8",
- "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
- "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==",
+ "node_modules/@mui/core-downloads-tracker": {
+ "version": "5.15.8",
+ "license": "MIT",
"funding": {
"type": "opencollective",
- "url": "https://opencollective.com/popperjs"
+ "url": "https://opencollective.com/mui-org"
}
},
- "node_modules/@react-native-community/cli": {
- "version": "11.4.1",
- "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-11.4.1.tgz",
- "integrity": "sha512-NdAageVMtNhtvRsrq4NgJf5Ey2nA1CqmLvn7PhSawg+aIzMKmZuzWxGVwr9CoPGyjvNiqJlCWrLGR7NzOyi/sA==",
+ "node_modules/@mui/icons-material": {
+ "version": "5.15.8",
"license": "MIT",
"dependencies": {
- "@react-native-community/cli-clean": "11.4.1",
- "@react-native-community/cli-config": "11.4.1",
- "@react-native-community/cli-debugger-ui": "11.4.1",
- "@react-native-community/cli-doctor": "11.4.1",
- "@react-native-community/cli-hermes": "11.4.1",
- "@react-native-community/cli-plugin-metro": "11.4.1",
- "@react-native-community/cli-server-api": "11.4.1",
- "@react-native-community/cli-tools": "11.4.1",
- "@react-native-community/cli-types": "11.4.1",
- "chalk": "^4.1.2",
- "commander": "^9.4.1",
- "execa": "^5.0.0",
- "find-up": "^4.1.0",
- "fs-extra": "^8.1.0",
- "graceful-fs": "^4.1.3",
- "prompts": "^2.4.0",
- "semver": "^7.5.2"
- },
- "bin": {
- "react-native": "build/bin.js"
+ "@babel/runtime": "^7.23.9"
},
"engines": {
- "node": ">=16"
- }
- },
- "node_modules/@react-native-community/cli-clean": {
- "version": "11.4.1",
- "resolved": "https://registry.npmjs.org/@react-native-community/cli-clean/-/cli-clean-11.4.1.tgz",
- "integrity": "sha512-cwUbY3c70oBGv3FvQJWe2Qkq6m1+/dcEBonMDTYyH6i+6OrkzI4RkIGpWmbG1IS5JfE9ISUZkNL3946sxyWNkw==",
- "license": "MIT",
- "dependencies": {
- "@react-native-community/cli-tools": "11.4.1",
- "chalk": "^4.1.2",
- "execa": "^5.0.0",
- "prompts": "^2.4.0"
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui-org"
+ },
+ "peerDependencies": {
+ "@mui/material": "^5.0.0",
+ "@types/react": "^17.0.0 || ^18.0.0",
+ "react": "^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
}
},
- "node_modules/@react-native-community/cli-clean/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==",
+ "node_modules/@mui/material": {
+ "version": "5.15.7",
"license": "MIT",
"dependencies": {
- "color-convert": "^2.0.1"
+ "@babel/runtime": "^7.23.9",
+ "@mui/base": "5.0.0-beta.34",
+ "@mui/core-downloads-tracker": "^5.15.7",
+ "@mui/system": "^5.15.7",
+ "@mui/types": "^7.2.13",
+ "@mui/utils": "^5.15.7",
+ "@types/react-transition-group": "^4.4.10",
+ "clsx": "^2.1.0",
+ "csstype": "^3.1.2",
+ "prop-types": "^15.8.1",
+ "react-is": "^18.2.0",
+ "react-transition-group": "^4.4.5"
},
"engines": {
- "node": ">=8"
+ "node": ">=12.0.0"
},
"funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui-org"
+ },
+ "peerDependencies": {
+ "@emotion/react": "^11.5.0",
+ "@emotion/styled": "^11.3.0",
+ "@types/react": "^17.0.0 || ^18.0.0",
+ "react": "^17.0.0 || ^18.0.0",
+ "react-dom": "^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@emotion/react": {
+ "optional": true
+ },
+ "@emotion/styled": {
+ "optional": true
+ },
+ "@types/react": {
+ "optional": true
+ }
}
},
- "node_modules/@react-native-community/cli-clean/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "node_modules/@mui/private-theming": {
+ "version": "5.15.8",
"license": "MIT",
"dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
+ "@babel/runtime": "^7.23.9",
+ "@mui/utils": "^5.15.8",
+ "prop-types": "^15.8.1"
},
"engines": {
- "node": ">=10"
+ "node": ">=12.0.0"
},
"funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui-org"
+ },
+ "peerDependencies": {
+ "@types/react": "^17.0.0 || ^18.0.0",
+ "react": "^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
}
},
- "node_modules/@react-native-community/cli-clean/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==",
+ "node_modules/@mui/styled-engine": {
+ "version": "5.15.8",
"license": "MIT",
"dependencies": {
- "color-name": "~1.1.4"
+ "@babel/runtime": "^7.23.9",
+ "@emotion/cache": "^11.11.0",
+ "csstype": "^3.1.2",
+ "prop-types": "^15.8.1"
},
"engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/@react-native-community/cli-clean/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==",
- "license": "MIT"
- },
- "node_modules/@react-native-community/cli-clean/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==",
- "license": "MIT",
- "engines": {
- "node": ">=8"
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui-org"
+ },
+ "peerDependencies": {
+ "@emotion/react": "^11.4.1",
+ "@emotion/styled": "^11.3.0",
+ "react": "^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@emotion/react": {
+ "optional": true
+ },
+ "@emotion/styled": {
+ "optional": true
+ }
}
},
- "node_modules/@react-native-community/cli-clean/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==",
+ "node_modules/@mui/system": {
+ "version": "5.15.8",
"license": "MIT",
"dependencies": {
- "has-flag": "^4.0.0"
+ "@babel/runtime": "^7.23.9",
+ "@mui/private-theming": "^5.15.8",
+ "@mui/styled-engine": "^5.15.8",
+ "@mui/types": "^7.2.13",
+ "@mui/utils": "^5.15.8",
+ "clsx": "^2.1.0",
+ "csstype": "^3.1.2",
+ "prop-types": "^15.8.1"
},
"engines": {
- "node": ">=8"
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui-org"
+ },
+ "peerDependencies": {
+ "@emotion/react": "^11.5.0",
+ "@emotion/styled": "^11.3.0",
+ "@types/react": "^17.0.0 || ^18.0.0",
+ "react": "^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@emotion/react": {
+ "optional": true
+ },
+ "@emotion/styled": {
+ "optional": true
+ },
+ "@types/react": {
+ "optional": true
+ }
}
},
- "node_modules/@react-native-community/cli-config": {
- "version": "11.4.1",
- "resolved": "https://registry.npmjs.org/@react-native-community/cli-config/-/cli-config-11.4.1.tgz",
- "integrity": "sha512-sLdv1HFVqu5xNpeaR1+std0t7FFZaobpmpR0lFCOzKV7H/l611qS2Vo8zssmMK+oQbCs5JsX3SFPciODeIlaWA==",
+ "node_modules/@mui/types": {
+ "version": "7.2.13",
"license": "MIT",
- "dependencies": {
- "@react-native-community/cli-tools": "11.4.1",
- "chalk": "^4.1.2",
- "cosmiconfig": "^5.1.0",
- "deepmerge": "^4.3.0",
- "glob": "^7.1.3",
- "joi": "^17.2.1"
+ "peerDependencies": {
+ "@types/react": "^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
}
},
- "node_modules/@react-native-community/cli-config/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==",
+ "node_modules/@mui/utils": {
+ "version": "5.15.8",
"license": "MIT",
"dependencies": {
- "color-convert": "^2.0.1"
+ "@babel/runtime": "^7.23.9",
+ "@types/prop-types": "^15.7.11",
+ "prop-types": "^15.8.1",
+ "react-is": "^18.2.0"
},
"engines": {
- "node": ">=8"
+ "node": ">=12.0.0"
},
"funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui-org"
+ },
+ "peerDependencies": {
+ "@types/react": "^17.0.0 || ^18.0.0",
+ "react": "^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
}
},
- "node_modules/@react-native-community/cli-config/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
},
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
+ "node": ">= 8"
}
},
- "node_modules/@react-native-community/cli-config/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==",
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "dev": true,
"license": "MIT",
- "dependencies": {
- "color-name": "~1.1.4"
- },
"engines": {
- "node": ">=7.0.0"
+ "node": ">= 8"
}
},
- "node_modules/@react-native-community/cli-config/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==",
- "license": "MIT"
- },
- "node_modules/@react-native-community/cli-config/node_modules/cosmiconfig": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz",
- "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==",
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "import-fresh": "^2.0.0",
- "is-directory": "^0.3.1",
- "js-yaml": "^3.13.1",
- "parse-json": "^4.0.0"
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
},
"engines": {
- "node": ">=4"
+ "node": ">= 8"
}
},
- "node_modules/@react-native-community/cli-config/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==",
+ "node_modules/@octokit/app": {
+ "version": "15.1.5",
"license": "MIT",
+ "dependencies": {
+ "@octokit/auth-app": "^7.1.5",
+ "@octokit/auth-unauthenticated": "^6.1.2",
+ "@octokit/core": "^6.1.4",
+ "@octokit/oauth-app": "^7.1.6",
+ "@octokit/plugin-paginate-rest": "^11.4.2",
+ "@octokit/types": "^13.8.0",
+ "@octokit/webhooks": "^13.6.1"
+ },
"engines": {
- "node": ">=8"
+ "node": ">= 18"
}
},
- "node_modules/@react-native-community/cli-config/node_modules/import-fresh": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz",
- "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==",
+ "node_modules/@octokit/auth-app": {
+ "version": "7.1.5",
"license": "MIT",
"dependencies": {
- "caller-path": "^2.0.0",
- "resolve-from": "^3.0.0"
+ "@octokit/auth-oauth-app": "^8.1.3",
+ "@octokit/auth-oauth-user": "^5.1.3",
+ "@octokit/request": "^9.2.1",
+ "@octokit/request-error": "^6.1.7",
+ "@octokit/types": "^13.8.0",
+ "toad-cache": "^3.7.0",
+ "universal-github-app-jwt": "^2.2.0",
+ "universal-user-agent": "^7.0.0"
},
"engines": {
- "node": ">=4"
+ "node": ">= 18"
}
},
- "node_modules/@react-native-community/cli-config/node_modules/parse-json": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
- "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==",
+ "node_modules/@octokit/auth-oauth-app": {
+ "version": "8.1.3",
"license": "MIT",
"dependencies": {
- "error-ex": "^1.3.1",
- "json-parse-better-errors": "^1.0.1"
+ "@octokit/auth-oauth-device": "^7.1.3",
+ "@octokit/auth-oauth-user": "^5.1.3",
+ "@octokit/request": "^9.2.1",
+ "@octokit/types": "^13.6.2",
+ "universal-user-agent": "^7.0.0"
},
"engines": {
- "node": ">=4"
+ "node": ">= 18"
}
},
- "node_modules/@react-native-community/cli-config/node_modules/resolve-from": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
- "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==",
+ "node_modules/@octokit/auth-oauth-device": {
+ "version": "7.1.3",
"license": "MIT",
+ "dependencies": {
+ "@octokit/oauth-methods": "^5.1.4",
+ "@octokit/request": "^9.2.1",
+ "@octokit/types": "^13.6.2",
+ "universal-user-agent": "^7.0.0"
+ },
"engines": {
- "node": ">=4"
+ "node": ">= 18"
}
},
- "node_modules/@react-native-community/cli-config/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==",
+ "node_modules/@octokit/auth-oauth-user": {
+ "version": "5.1.3",
"license": "MIT",
"dependencies": {
- "has-flag": "^4.0.0"
+ "@octokit/auth-oauth-device": "^7.1.3",
+ "@octokit/oauth-methods": "^5.1.3",
+ "@octokit/request": "^9.2.1",
+ "@octokit/types": "^13.6.2",
+ "universal-user-agent": "^7.0.0"
},
"engines": {
- "node": ">=8"
+ "node": ">= 18"
}
},
- "node_modules/@react-native-community/cli-debugger-ui": {
- "version": "11.4.1",
- "resolved": "https://registry.npmjs.org/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-11.4.1.tgz",
- "integrity": "sha512-+pgIjGNW5TrJF37XG3djIOzP+WNoPp67to/ggDhrshuYgpymfb9XpDVsURJugy0Sy3RViqb83kQNK765QzTIvw==",
+ "node_modules/@octokit/auth-token": {
+ "version": "5.1.2",
"license": "MIT",
- "dependencies": {
- "serve-static": "^1.13.1"
+ "engines": {
+ "node": ">= 18"
}
},
- "node_modules/@react-native-community/cli-doctor": {
- "version": "11.4.1",
- "resolved": "https://registry.npmjs.org/@react-native-community/cli-doctor/-/cli-doctor-11.4.1.tgz",
- "integrity": "sha512-O6oPiRsl8pdkcyNktpzvJAXUqdocoY4jh7Tt7wA69B1JKCJA7aPCecwJgpUZb63ZYoxOtRtYM3BYQKzRMLIuUw==",
+ "node_modules/@octokit/auth-unauthenticated": {
+ "version": "6.1.2",
"license": "MIT",
"dependencies": {
- "@react-native-community/cli-config": "11.4.1",
- "@react-native-community/cli-platform-android": "11.4.1",
- "@react-native-community/cli-platform-ios": "11.4.1",
- "@react-native-community/cli-tools": "11.4.1",
- "chalk": "^4.1.2",
- "command-exists": "^1.2.8",
- "envinfo": "^7.7.2",
- "execa": "^5.0.0",
- "hermes-profile-transformer": "^0.0.6",
- "node-stream-zip": "^1.9.1",
- "ora": "^5.4.1",
- "prompts": "^2.4.0",
- "semver": "^7.5.2",
- "strip-ansi": "^5.2.0",
- "sudo-prompt": "^9.0.0",
- "wcwidth": "^1.0.1",
- "yaml": "^2.2.1"
+ "@octokit/request-error": "^6.1.7",
+ "@octokit/types": "^13.6.2"
+ },
+ "engines": {
+ "node": ">= 18"
}
},
- "node_modules/@react-native-community/cli-doctor/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==",
+ "node_modules/@octokit/core": {
+ "version": "6.1.4",
"license": "MIT",
"dependencies": {
- "color-convert": "^2.0.1"
+ "@octokit/auth-token": "^5.0.0",
+ "@octokit/graphql": "^8.1.2",
+ "@octokit/request": "^9.2.1",
+ "@octokit/request-error": "^6.1.7",
+ "@octokit/types": "^13.6.2",
+ "before-after-hook": "^3.0.2",
+ "universal-user-agent": "^7.0.0"
},
"engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ "node": ">= 18"
}
},
- "node_modules/@react-native-community/cli-doctor/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "node_modules/@octokit/endpoint": {
+ "version": "10.1.3",
"license": "MIT",
"dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
+ "@octokit/types": "^13.6.2",
+ "universal-user-agent": "^7.0.2"
},
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
+ "node": ">= 18"
}
},
- "node_modules/@react-native-community/cli-doctor/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==",
+ "node_modules/@octokit/graphql": {
+ "version": "8.2.1",
"license": "MIT",
"dependencies": {
- "color-name": "~1.1.4"
+ "@octokit/request": "^9.2.2",
+ "@octokit/types": "^13.8.0",
+ "universal-user-agent": "^7.0.0"
},
"engines": {
- "node": ">=7.0.0"
+ "node": ">= 18"
}
},
- "node_modules/@react-native-community/cli-doctor/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==",
- "license": "MIT"
- },
- "node_modules/@react-native-community/cli-doctor/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==",
+ "node_modules/@octokit/oauth-app": {
+ "version": "7.1.6",
"license": "MIT",
+ "dependencies": {
+ "@octokit/auth-oauth-app": "^8.1.3",
+ "@octokit/auth-oauth-user": "^5.1.3",
+ "@octokit/auth-unauthenticated": "^6.1.2",
+ "@octokit/core": "^6.1.4",
+ "@octokit/oauth-authorization-url": "^7.1.1",
+ "@octokit/oauth-methods": "^5.1.4",
+ "@types/aws-lambda": "^8.10.83",
+ "universal-user-agent": "^7.0.0"
+ },
"engines": {
- "node": ">=8"
+ "node": ">= 18"
}
},
- "node_modules/@react-native-community/cli-doctor/node_modules/semver": {
- "version": "7.6.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
- "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- },
+ "node_modules/@octokit/oauth-authorization-url": {
+ "version": "7.1.1",
+ "license": "MIT",
"engines": {
- "node": ">=10"
+ "node": ">= 18"
}
},
- "node_modules/@react-native-community/cli-doctor/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==",
+ "node_modules/@octokit/oauth-methods": {
+ "version": "5.1.4",
"license": "MIT",
"dependencies": {
- "has-flag": "^4.0.0"
+ "@octokit/oauth-authorization-url": "^7.0.0",
+ "@octokit/request": "^9.2.1",
+ "@octokit/request-error": "^6.1.7",
+ "@octokit/types": "^13.6.2"
},
"engines": {
- "node": ">=8"
+ "node": ">= 18"
}
},
- "node_modules/@react-native-community/cli-hermes": {
- "version": "11.4.1",
- "resolved": "https://registry.npmjs.org/@react-native-community/cli-hermes/-/cli-hermes-11.4.1.tgz",
- "integrity": "sha512-1VAjwcmv+i9BJTMMVn5Grw7AcgURhTyfHVghJ1YgBE2euEJxPuqPKSxP54wBOQKnWUwsuDQAtQf+jPJoCxJSSA==",
- "license": "MIT",
- "dependencies": {
- "@react-native-community/cli-platform-android": "11.4.1",
- "@react-native-community/cli-tools": "11.4.1",
- "chalk": "^4.1.2",
- "hermes-profile-transformer": "^0.0.6"
- }
+ "node_modules/@octokit/openapi-types": {
+ "version": "23.0.1",
+ "license": "MIT"
},
- "node_modules/@react-native-community/cli-hermes/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==",
+ "node_modules/@octokit/openapi-webhooks-types": {
+ "version": "10.1.1",
+ "license": "MIT"
+ },
+ "node_modules/@octokit/plugin-paginate-graphql": {
+ "version": "5.2.4",
"license": "MIT",
- "dependencies": {
- "color-convert": "^2.0.1"
- },
"engines": {
- "node": ">=8"
+ "node": ">= 18"
},
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ "peerDependencies": {
+ "@octokit/core": ">=6"
}
},
- "node_modules/@react-native-community/cli-hermes/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "node_modules/@octokit/plugin-paginate-rest": {
+ "version": "11.4.3",
"license": "MIT",
"dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
+ "@octokit/types": "^13.7.0"
},
"engines": {
- "node": ">=10"
+ "node": ">= 18"
},
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
+ "peerDependencies": {
+ "@octokit/core": ">=6"
}
},
- "node_modules/@react-native-community/cli-hermes/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==",
+ "node_modules/@octokit/plugin-rest-endpoint-methods": {
+ "version": "13.3.1",
"license": "MIT",
"dependencies": {
- "color-name": "~1.1.4"
+ "@octokit/types": "^13.8.0"
},
"engines": {
- "node": ">=7.0.0"
+ "node": ">= 18"
+ },
+ "peerDependencies": {
+ "@octokit/core": ">=6"
}
},
- "node_modules/@react-native-community/cli-hermes/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==",
- "license": "MIT"
- },
- "node_modules/@react-native-community/cli-hermes/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==",
+ "node_modules/@octokit/plugin-retry": {
+ "version": "7.1.4",
"license": "MIT",
+ "dependencies": {
+ "@octokit/request-error": "^6.1.7",
+ "@octokit/types": "^13.6.2",
+ "bottleneck": "^2.15.3"
+ },
"engines": {
- "node": ">=8"
+ "node": ">= 18"
+ },
+ "peerDependencies": {
+ "@octokit/core": ">=6"
}
},
- "node_modules/@react-native-community/cli-hermes/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==",
+ "node_modules/@octokit/plugin-throttling": {
+ "version": "9.4.0",
"license": "MIT",
"dependencies": {
- "has-flag": "^4.0.0"
+ "@octokit/types": "^13.7.0",
+ "bottleneck": "^2.15.3"
},
"engines": {
- "node": ">=8"
+ "node": ">= 18"
+ },
+ "peerDependencies": {
+ "@octokit/core": "^6.1.3"
}
},
- "node_modules/@react-native-community/cli-platform-android": {
- "version": "11.4.1",
- "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-11.4.1.tgz",
- "integrity": "sha512-VMmXWIzk0Dq5RAd+HIEa3Oe7xl2jso7+gOr6E2HALF4A3fCKUjKZQ6iK2t6AfnY04zftvaiKw6zUXtrfl52AVQ==",
+ "node_modules/@octokit/request": {
+ "version": "9.2.2",
"license": "MIT",
"dependencies": {
- "@react-native-community/cli-tools": "11.4.1",
- "chalk": "^4.1.2",
- "execa": "^5.0.0",
- "glob": "^7.1.3",
- "logkitty": "^0.7.1"
+ "@octokit/endpoint": "^10.1.3",
+ "@octokit/request-error": "^6.1.7",
+ "@octokit/types": "^13.6.2",
+ "fast-content-type-parse": "^2.0.0",
+ "universal-user-agent": "^7.0.2"
+ },
+ "engines": {
+ "node": ">= 18"
}
},
- "node_modules/@react-native-community/cli-platform-android/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==",
+ "node_modules/@octokit/request-error": {
+ "version": "6.1.7",
"license": "MIT",
"dependencies": {
- "color-convert": "^2.0.1"
+ "@octokit/types": "^13.6.2"
},
"engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ "node": ">= 18"
}
},
- "node_modules/@react-native-community/cli-platform-android/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "node_modules/@octokit/types": {
+ "version": "13.8.0",
"license": "MIT",
"dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
+ "@octokit/openapi-types": "^23.0.1"
}
},
- "node_modules/@react-native-community/cli-platform-android/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==",
+ "node_modules/@octokit/webhooks": {
+ "version": "13.7.4",
"license": "MIT",
"dependencies": {
- "color-name": "~1.1.4"
+ "@octokit/openapi-webhooks-types": "10.1.1",
+ "@octokit/request-error": "^6.1.7",
+ "@octokit/webhooks-methods": "^5.1.1"
},
"engines": {
- "node": ">=7.0.0"
+ "node": ">= 18"
}
},
- "node_modules/@react-native-community/cli-platform-android/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==",
- "license": "MIT"
- },
- "node_modules/@react-native-community/cli-platform-android/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==",
+ "node_modules/@octokit/webhooks-methods": {
+ "version": "5.1.1",
"license": "MIT",
"engines": {
- "node": ">=8"
+ "node": ">= 18"
}
},
- "node_modules/@react-native-community/cli-platform-android/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==",
+ "node_modules/@pmmmwh/react-refresh-webpack-plugin": {
+ "version": "0.5.11",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "has-flag": "^4.0.0"
+ "ansi-html-community": "^0.0.8",
+ "common-path-prefix": "^3.0.0",
+ "core-js-pure": "^3.23.3",
+ "error-stack-parser": "^2.0.6",
+ "find-up": "^5.0.0",
+ "html-entities": "^2.1.0",
+ "loader-utils": "^2.0.4",
+ "schema-utils": "^3.0.0",
+ "source-map": "^0.7.3"
},
"engines": {
- "node": ">=8"
- }
- },
- "node_modules/@react-native-community/cli-platform-ios": {
- "version": "11.4.1",
- "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-11.4.1.tgz",
- "integrity": "sha512-RPhwn+q3IY9MpWc9w/Qmzv03mo8sXdah2eSZcECgweqD5SHWtOoRCUt11zM8jASpAQ8Tm5Je7YE9bHvdwGl4hA==",
- "license": "MIT",
- "dependencies": {
- "@react-native-community/cli-tools": "11.4.1",
- "chalk": "^4.1.2",
- "execa": "^5.0.0",
- "fast-xml-parser": "^4.0.12",
- "glob": "^7.1.3",
- "ora": "^5.4.1"
+ "node": ">= 10.13"
+ },
+ "peerDependencies": {
+ "@types/webpack": "4.x || 5.x",
+ "react-refresh": ">=0.10.0 <1.0.0",
+ "sockjs-client": "^1.4.0",
+ "type-fest": ">=0.17.0 <5.0.0",
+ "webpack": ">=4.43.0 <6.0.0",
+ "webpack-dev-server": "3.x || 4.x",
+ "webpack-hot-middleware": "2.x",
+ "webpack-plugin-serve": "0.x || 1.x"
+ },
+ "peerDependenciesMeta": {
+ "@types/webpack": {
+ "optional": true
+ },
+ "sockjs-client": {
+ "optional": true
+ },
+ "type-fest": {
+ "optional": true
+ },
+ "webpack-dev-server": {
+ "optional": true
+ },
+ "webpack-hot-middleware": {
+ "optional": true
+ },
+ "webpack-plugin-serve": {
+ "optional": true
+ }
}
},
- "node_modules/@react-native-community/cli-platform-ios/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==",
- "license": "MIT",
- "dependencies": {
- "color-convert": "^2.0.1"
- },
+ "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/source-map": {
+ "version": "0.7.4",
+ "dev": true,
+ "license": "BSD-3-Clause",
"engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ "node": ">= 8"
}
},
- "node_modules/@react-native-community/cli-platform-ios/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "node_modules/@popperjs/core": {
+ "version": "2.11.8",
"license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
"funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
+ "type": "opencollective",
+ "url": "https://opencollective.com/popperjs"
}
},
- "node_modules/@react-native-community/cli-platform-ios/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==",
+ "node_modules/@react-native-community/cli": {
+ "version": "11.4.1",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
- "color-name": "~1.1.4"
+ "@react-native-community/cli-clean": "11.4.1",
+ "@react-native-community/cli-config": "11.4.1",
+ "@react-native-community/cli-debugger-ui": "11.4.1",
+ "@react-native-community/cli-doctor": "11.4.1",
+ "@react-native-community/cli-hermes": "11.4.1",
+ "@react-native-community/cli-plugin-metro": "11.4.1",
+ "@react-native-community/cli-server-api": "11.4.1",
+ "@react-native-community/cli-tools": "11.4.1",
+ "@react-native-community/cli-types": "11.4.1",
+ "chalk": "^4.1.2",
+ "commander": "^9.4.1",
+ "execa": "^5.0.0",
+ "find-up": "^4.1.0",
+ "fs-extra": "^8.1.0",
+ "graceful-fs": "^4.1.3",
+ "prompts": "^2.4.0",
+ "semver": "^7.5.2"
+ },
+ "bin": {
+ "react-native": "build/bin.js"
},
"engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/@react-native-community/cli-platform-ios/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==",
- "license": "MIT"
- },
- "node_modules/@react-native-community/cli-platform-ios/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==",
- "license": "MIT",
- "engines": {
- "node": ">=8"
+ "node": ">=16"
}
},
- "node_modules/@react-native-community/cli-platform-ios/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==",
+ "node_modules/@react-native-community/cli-clean": {
+ "version": "11.4.1",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
+ "@react-native-community/cli-tools": "11.4.1",
+ "chalk": "^4.1.2",
+ "execa": "^5.0.0",
+ "prompts": "^2.4.0"
}
},
- "node_modules/@react-native-community/cli-plugin-metro": {
+ "node_modules/@react-native-community/cli-config": {
"version": "11.4.1",
- "resolved": "https://registry.npmjs.org/@react-native-community/cli-plugin-metro/-/cli-plugin-metro-11.4.1.tgz",
- "integrity": "sha512-JxbIqknYcQ5Z4rWROtu5LNakLfMiKoWcMoPqIrBLrV5ILm1XUJj1/8fATCcotZqV3yzB3SCJ3RrhKx7dQ3YELw==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
- "@react-native-community/cli-server-api": "11.4.1",
"@react-native-community/cli-tools": "11.4.1",
"chalk": "^4.1.2",
- "execa": "^5.0.0",
- "metro": "^0.76.9",
- "metro-config": "^0.76.9",
- "metro-core": "^0.76.9",
- "metro-react-native-babel-transformer": "^0.76.9",
- "metro-resolver": "^0.76.9",
- "metro-runtime": "^0.76.9",
- "readline": "^1.3.0"
+ "cosmiconfig": "^5.1.0",
+ "deepmerge": "^4.3.0",
+ "glob": "^7.1.3",
+ "joi": "^17.2.1"
}
},
- "node_modules/@react-native-community/cli-plugin-metro/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==",
+ "node_modules/@react-native-community/cli-config/node_modules/cosmiconfig": {
+ "version": "5.2.1",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
- "color-convert": "^2.0.1"
+ "import-fresh": "^2.0.0",
+ "is-directory": "^0.3.1",
+ "js-yaml": "^3.13.1",
+ "parse-json": "^4.0.0"
},
"engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ "node": ">=4"
}
},
- "node_modules/@react-native-community/cli-plugin-metro/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "node_modules/@react-native-community/cli-config/node_modules/import-fresh": {
+ "version": "2.0.0",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
+ "caller-path": "^2.0.0",
+ "resolve-from": "^3.0.0"
},
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
+ "node": ">=4"
}
},
- "node_modules/@react-native-community/cli-plugin-metro/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==",
+ "node_modules/@react-native-community/cli-config/node_modules/parse-json": {
+ "version": "4.0.0",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
- "color-name": "~1.1.4"
+ "error-ex": "^1.3.1",
+ "json-parse-better-errors": "^1.0.1"
},
"engines": {
- "node": ">=7.0.0"
+ "node": ">=4"
}
},
- "node_modules/@react-native-community/cli-plugin-metro/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==",
- "license": "MIT"
- },
- "node_modules/@react-native-community/cli-plugin-metro/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==",
+ "node_modules/@react-native-community/cli-config/node_modules/resolve-from": {
+ "version": "3.0.0",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"engines": {
- "node": ">=8"
+ "node": ">=4"
}
},
- "node_modules/@react-native-community/cli-plugin-metro/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==",
+ "node_modules/@react-native-community/cli-debugger-ui": {
+ "version": "11.4.1",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
+ "serve-static": "^1.13.1"
}
},
- "node_modules/@react-native-community/cli-server-api": {
+ "node_modules/@react-native-community/cli-doctor": {
"version": "11.4.1",
- "resolved": "https://registry.npmjs.org/@react-native-community/cli-server-api/-/cli-server-api-11.4.1.tgz",
- "integrity": "sha512-isxXE8X5x+C4kN90yilD08jaLWD34hfqTfn/Xbl1u/igtdTsCaQGvWe9eaFamrpWFWTpVtj6k+vYfy8AtYSiKA==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
- "@react-native-community/cli-debugger-ui": "11.4.1",
+ "@react-native-community/cli-config": "11.4.1",
+ "@react-native-community/cli-platform-android": "11.4.1",
+ "@react-native-community/cli-platform-ios": "11.4.1",
+ "@react-native-community/cli-tools": "11.4.1",
+ "chalk": "^4.1.2",
+ "command-exists": "^1.2.8",
+ "envinfo": "^7.7.2",
+ "execa": "^5.0.0",
+ "hermes-profile-transformer": "^0.0.6",
+ "node-stream-zip": "^1.9.1",
+ "ora": "^5.4.1",
+ "prompts": "^2.4.0",
+ "semver": "^7.5.2",
+ "strip-ansi": "^5.2.0",
+ "sudo-prompt": "^9.0.0",
+ "wcwidth": "^1.0.1",
+ "yaml": "^2.2.1"
+ }
+ },
+ "node_modules/@react-native-community/cli-doctor/node_modules/semver": {
+ "version": "7.6.3",
+ "license": "ISC",
+ "optional": true,
+ "peer": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@react-native-community/cli-hermes": {
+ "version": "11.4.1",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@react-native-community/cli-platform-android": "11.4.1",
+ "@react-native-community/cli-tools": "11.4.1",
+ "chalk": "^4.1.2",
+ "hermes-profile-transformer": "^0.0.6"
+ }
+ },
+ "node_modules/@react-native-community/cli-platform-android": {
+ "version": "11.4.1",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@react-native-community/cli-tools": "11.4.1",
+ "chalk": "^4.1.2",
+ "execa": "^5.0.0",
+ "glob": "^7.1.3",
+ "logkitty": "^0.7.1"
+ }
+ },
+ "node_modules/@react-native-community/cli-platform-ios": {
+ "version": "11.4.1",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@react-native-community/cli-tools": "11.4.1",
+ "chalk": "^4.1.2",
+ "execa": "^5.0.0",
+ "fast-xml-parser": "^4.0.12",
+ "glob": "^7.1.3",
+ "ora": "^5.4.1"
+ }
+ },
+ "node_modules/@react-native-community/cli-plugin-metro": {
+ "version": "11.4.1",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@react-native-community/cli-server-api": "11.4.1",
+ "@react-native-community/cli-tools": "11.4.1",
+ "chalk": "^4.1.2",
+ "execa": "^5.0.0",
+ "metro": "^0.76.9",
+ "metro-config": "^0.76.9",
+ "metro-core": "^0.76.9",
+ "metro-react-native-babel-transformer": "^0.76.9",
+ "metro-resolver": "^0.76.9",
+ "metro-runtime": "^0.76.9",
+ "readline": "^1.3.0"
+ }
+ },
+ "node_modules/@react-native-community/cli-server-api": {
+ "version": "11.4.1",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@react-native-community/cli-debugger-ui": "11.4.1",
"@react-native-community/cli-tools": "11.4.1",
"compression": "^1.7.1",
"connect": "^3.6.5",
@@ -4368,9 +4457,9 @@
},
"node_modules/@react-native-community/cli-server-api/node_modules/@jest/types": {
"version": "26.6.2",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz",
- "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@types/istanbul-lib-coverage": "^2.0.0",
"@types/istanbul-reports": "^3.0.0",
@@ -4384,18 +4473,18 @@
},
"node_modules/@react-native-community/cli-server-api/node_modules/@types/yargs": {
"version": "15.0.19",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.19.tgz",
- "integrity": "sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@types/yargs-parser": "*"
}
},
"node_modules/@react-native-community/cli-server-api/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==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"color-convert": "^2.0.1"
},
@@ -4406,27 +4495,11 @@
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
- "node_modules/@react-native-community/cli-server-api/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "license": "MIT",
- "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/@react-native-community/cli-server-api/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==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"color-name": "~1.1.4"
},
@@ -4436,24 +4509,15 @@
},
"node_modules/@react-native-community/cli-server-api/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==",
- "license": "MIT"
- },
- "node_modules/@react-native-community/cli-server-api/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==",
"license": "MIT",
- "engines": {
- "node": ">=8"
- }
+ "optional": true,
+ "peer": true
},
"node_modules/@react-native-community/cli-server-api/node_modules/pretty-format": {
"version": "26.6.2",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz",
- "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@jest/types": "^26.6.2",
"ansi-regex": "^5.0.0",
@@ -4466,27 +4530,15 @@
},
"node_modules/@react-native-community/cli-server-api/node_modules/react-is": {
"version": "17.0.2",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
- "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
- "license": "MIT"
- },
- "node_modules/@react-native-community/cli-server-api/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==",
"license": "MIT",
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
+ "optional": true,
+ "peer": true
},
"node_modules/@react-native-community/cli-server-api/node_modules/ws": {
"version": "7.5.10",
- "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz",
- "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"engines": {
"node": ">=8.3.0"
},
@@ -4505,9 +4557,9 @@
},
"node_modules/@react-native-community/cli-tools": {
"version": "11.4.1",
- "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-11.4.1.tgz",
- "integrity": "sha512-GuQIuY/kCPfLeXB1aiPZ5HvF+e/wdO42AYuNEmT7FpH/0nAhdTxA9qjL8m3vatDD2/YK7WNOSVNsl2UBZuOISg==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"appdirsjs": "^1.2.4",
"chalk": "^4.1.2",
@@ -4520,69 +4572,84 @@
"shell-quote": "^1.7.3"
}
},
- "node_modules/@react-native-community/cli-tools/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==",
+ "node_modules/@react-native-community/cli-tools/node_modules/semver": {
+ "version": "7.6.3",
+ "license": "ISC",
+ "optional": true,
+ "peer": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@react-native-community/cli-types": {
+ "version": "11.4.1",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
- "color-convert": "^2.0.1"
+ "joi": "^17.2.1"
+ }
+ },
+ "node_modules/@react-native-community/cli/node_modules/find-up": {
+ "version": "4.1.0",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
},
"engines": {
"node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
- "node_modules/@react-native-community/cli-tools/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "node_modules/@react-native-community/cli/node_modules/locate-path": {
+ "version": "5.0.0",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
+ "p-locate": "^4.1.0"
},
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
+ "node": ">=8"
}
},
- "node_modules/@react-native-community/cli-tools/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==",
+ "node_modules/@react-native-community/cli/node_modules/p-limit": {
+ "version": "2.3.0",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
- "color-name": "~1.1.4"
+ "p-try": "^2.0.0"
},
"engines": {
- "node": ">=7.0.0"
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/@react-native-community/cli-tools/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==",
- "license": "MIT"
- },
- "node_modules/@react-native-community/cli-tools/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==",
+ "node_modules/@react-native-community/cli/node_modules/p-locate": {
+ "version": "4.1.0",
"license": "MIT",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
"engines": {
"node": ">=8"
}
},
- "node_modules/@react-native-community/cli-tools/node_modules/semver": {
+ "node_modules/@react-native-community/cli/node_modules/semver": {
"version": "7.6.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
- "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
"license": "ISC",
+ "optional": true,
+ "peer": true,
"bin": {
"semver": "bin/semver.js"
},
@@ -4590,170 +4657,17 @@
"node": ">=10"
}
},
- "node_modules/@react-native-community/cli-tools/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==",
+ "node_modules/@react-native/assets-registry": {
+ "version": "0.72.0",
"license": "MIT",
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
+ "optional": true,
+ "peer": true
},
- "node_modules/@react-native-community/cli-types": {
- "version": "11.4.1",
- "resolved": "https://registry.npmjs.org/@react-native-community/cli-types/-/cli-types-11.4.1.tgz",
- "integrity": "sha512-B3q9A5BCneLDSoK/iSJ06MNyBn1qTxjdJeOgeS3MiCxgJpPcxyn/Yrc6+h0Cu9T9sgWj/dmectQPYWxtZeo5VA==",
+ "node_modules/@react-native/codegen": {
+ "version": "0.72.8",
"license": "MIT",
- "dependencies": {
- "joi": "^17.2.1"
- }
- },
- "node_modules/@react-native-community/cli/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==",
- "license": "MIT",
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/@react-native-community/cli/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "license": "MIT",
- "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/@react-native-community/cli/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==",
- "license": "MIT",
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/@react-native-community/cli/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==",
- "license": "MIT"
- },
- "node_modules/@react-native-community/cli/node_modules/find-up": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
- "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
- "license": "MIT",
- "dependencies": {
- "locate-path": "^5.0.0",
- "path-exists": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@react-native-community/cli/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==",
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@react-native-community/cli/node_modules/locate-path": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
- "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
- "license": "MIT",
- "dependencies": {
- "p-locate": "^4.1.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@react-native-community/cli/node_modules/p-limit": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
- "license": "MIT",
- "dependencies": {
- "p-try": "^2.0.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@react-native-community/cli/node_modules/p-locate": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
- "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
- "license": "MIT",
- "dependencies": {
- "p-limit": "^2.2.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@react-native-community/cli/node_modules/semver": {
- "version": "7.6.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
- "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/@react-native-community/cli/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==",
- "license": "MIT",
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@react-native/assets-registry": {
- "version": "0.72.0",
- "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.72.0.tgz",
- "integrity": "sha512-Im93xRJuHHxb1wniGhBMsxLwcfzdYreSZVQGDoMJgkd6+Iky61LInGEHnQCTN0fKNYF1Dvcofb4uMmE1RQHXHQ=="
- },
- "node_modules/@react-native/codegen": {
- "version": "0.72.8",
- "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.72.8.tgz",
- "integrity": "sha512-jQCcBlXV7B7ap5VlHhwIPieYz89yiRgwd2FPUBu+unz+kcJ6pAiB2U8RdLDmyIs8fiWd+Vq1xxaWs4TR329/ng==",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/parser": "^7.20.0",
"flow-parser": "^0.206.0",
@@ -4769,23 +4683,27 @@
},
"node_modules/@react-native/gradle-plugin": {
"version": "0.72.11",
- "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.72.11.tgz",
- "integrity": "sha512-P9iRnxiR2w7EHcZ0mJ+fmbPzMby77ZzV6y9sJI3lVLJzF7TLSdbwcQyD3lwMsiL+q5lKUHoZJS4sYmih+P2HXw=="
+ "license": "MIT",
+ "optional": true,
+ "peer": true
},
"node_modules/@react-native/js-polyfills": {
"version": "0.72.1",
- "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.72.1.tgz",
- "integrity": "sha512-cRPZh2rBswFnGt5X5EUEPs0r+pAsXxYsifv/fgy9ZLQokuT52bPH+9xjDR+7TafRua5CttGW83wP4TntRcWNDA=="
+ "license": "MIT",
+ "optional": true,
+ "peer": true
},
"node_modules/@react-native/normalize-colors": {
"version": "0.72.0",
- "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.72.0.tgz",
- "integrity": "sha512-285lfdqSXaqKuBbbtP9qL2tDrfxdOFtIMvkKadtleRQkdOxx+uzGvFr82KHmc/sSiMtfXGp7JnFYWVh4sFl7Yw=="
+ "license": "MIT",
+ "optional": true,
+ "peer": true
},
"node_modules/@react-native/virtualized-lists": {
"version": "0.72.8",
- "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.72.8.tgz",
- "integrity": "sha512-J3Q4Bkuo99k7mu+jPS9gSUSgq+lLRSI/+ahXNwV92XgJ/8UgOTxu2LPwhJnBk/sQKxq7E8WkZBnBiozukQMqrw==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"invariant": "^2.2.4",
"nullthrows": "^1.1.1"
@@ -4796,9 +4714,8 @@
},
"node_modules/@redux-devtools/core": {
"version": "3.14.0",
- "resolved": "https://registry.npmjs.org/@redux-devtools/core/-/core-3.14.0.tgz",
- "integrity": "sha512-OMPflPPCXR9L1rpfd7gwY31/EuqPyE9Of/5wZgDDzeisaENY5h/EfnAjnHRKr7NIx/yUIUX2DJs8NpmUOnANMg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@babel/runtime": "^7.23.2",
"@redux-devtools/instrument": "^2.2.0",
@@ -4814,9 +4731,8 @@
},
"node_modules/@redux-devtools/instrument": {
"version": "2.2.0",
- "resolved": "https://registry.npmjs.org/@redux-devtools/instrument/-/instrument-2.2.0.tgz",
- "integrity": "sha512-HKaL+ghBQ4ZQkM/kEQIKx8dNwz4E1oeiCDfdQlpPXxEi/BrisyrFFncAXb1y2HIJsLV9zSvQUR2jRtMDWgfi8w==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@babel/runtime": "^7.23.2",
"lodash": "^4.17.21"
@@ -4827,8 +4743,7 @@
},
"node_modules/@reduxjs/toolkit": {
"version": "1.9.7",
- "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.7.tgz",
- "integrity": "sha512-t7v8ZPxhhKgOKtU+uyJT13lu4vL7az5aFi4IdoDs/eS548edn2M8Ik9h8fxgvMjGoAUVFSt6ZC1P5cWmQ014QQ==",
+ "license": "MIT",
"dependencies": {
"immer": "^9.0.21",
"redux": "^4.2.1",
@@ -4850,16 +4765,37 @@
},
"node_modules/@remix-run/router": {
"version": "1.15.0",
- "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.15.0.tgz",
- "integrity": "sha512-HOil5aFtme37dVQTB6M34G95kPM3MMuqSmIRVCC52eKV+Y/tGSqw9P3rWhlAx6A+mz+MoX+XxsGsNJbaI5qCgQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@rollup/plugin-inject": {
+ "version": "5.0.5",
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-inject/-/plugin-inject-5.0.5.tgz",
+ "integrity": "sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@rollup/pluginutils": "^5.0.1",
+ "estree-walker": "^2.0.2",
+ "magic-string": "^0.30.3"
+ },
"engines": {
"node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
+ },
+ "peerDependenciesMeta": {
+ "rollup": {
+ "optional": true
+ }
}
},
"node_modules/@rollup/pluginutils": {
"version": "5.1.4",
- "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz",
- "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@types/estree": "^1.0.0",
@@ -4880,8 +4816,7 @@
},
"node_modules/@rollup/pluginutils/node_modules/picomatch": {
"version": "4.0.2",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz",
- "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=12"
@@ -4891,9 +4826,9 @@
}
},
"node_modules/@rollup/rollup-android-arm-eabi": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.9.tgz",
- "integrity": "sha512-qZdlImWXur0CFakn2BJ2znJOdqYZKiedEPEVNTBrpfPjc/YuTGcaYZcdmNFTkUj3DU0ZM/AElcM8Ybww3xVLzA==",
+ "version": "4.44.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.44.0.tgz",
+ "integrity": "sha512-xEiEE5oDW6tK4jXCAyliuntGR+amEMO7HLtdSshVuhFnKTYoeYMyXQK7pLouAJJj5KHdwdn87bfHAR2nSdNAUA==",
"cpu": [
"arm"
],
@@ -4904,9 +4839,9 @@
]
},
"node_modules/@rollup/rollup-android-arm64": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.9.tgz",
- "integrity": "sha512-4KW7P53h6HtJf5Y608T1ISKvNIYLWRKMvfnG0c44M6In4DQVU58HZFEVhWINDZKp7FZps98G3gxwC1sb0wXUUg==",
+ "version": "4.44.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.44.0.tgz",
+ "integrity": "sha512-uNSk/TgvMbskcHxXYHzqwiyBlJ/lGcv8DaUfcnNwict8ba9GTTNxfn3/FAoFZYgkaXXAdrAA+SLyKplyi349Jw==",
"cpu": [
"arm64"
],
@@ -4917,9 +4852,9 @@
]
},
"node_modules/@rollup/rollup-darwin-arm64": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.9.tgz",
- "integrity": "sha512-0CY3/K54slrzLDjOA7TOjN1NuLKERBgk9nY5V34mhmuu673YNb+7ghaDUs6N0ujXR7fz5XaS5Aa6d2TNxZd0OQ==",
+ "version": "4.44.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.44.0.tgz",
+ "integrity": "sha512-VGF3wy0Eq1gcEIkSCr8Ke03CWT+Pm2yveKLaDvq51pPpZza3JX/ClxXOCmTYYq3us5MvEuNRTaeyFThCKRQhOA==",
"cpu": [
"arm64"
],
@@ -4930,9 +4865,9 @@
]
},
"node_modules/@rollup/rollup-darwin-x64": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.9.tgz",
- "integrity": "sha512-eOojSEAi/acnsJVYRxnMkPFqcxSMFfrw7r2iD9Q32SGkb/Q9FpUY1UlAu1DH9T7j++gZ0lHjnm4OyH2vCI7l7Q==",
+ "version": "4.44.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.44.0.tgz",
+ "integrity": "sha512-fBkyrDhwquRvrTxSGH/qqt3/T0w5Rg0L7ZIDypvBPc1/gzjJle6acCpZ36blwuwcKD/u6oCE/sRWlUAcxLWQbQ==",
"cpu": [
"x64"
],
@@ -4943,9 +4878,9 @@
]
},
"node_modules/@rollup/rollup-freebsd-arm64": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.9.tgz",
- "integrity": "sha512-2lzjQPJbN5UnHm7bHIUKFMulGTQwdvOkouJDpPysJS+QFBGDJqcfh+CxxtG23Ik/9tEvnebQiylYoazFMAgrYw==",
+ "version": "4.44.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.44.0.tgz",
+ "integrity": "sha512-u5AZzdQJYJXByB8giQ+r4VyfZP+walV+xHWdaFx/1VxsOn6eWJhK2Vl2eElvDJFKQBo/hcYIBg/jaKS8ZmKeNQ==",
"cpu": [
"arm64"
],
@@ -4956,9 +4891,9 @@
]
},
"node_modules/@rollup/rollup-freebsd-x64": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.9.tgz",
- "integrity": "sha512-SLl0hi2Ah2H7xQYd6Qaiu01kFPzQ+hqvdYSoOtHYg/zCIFs6t8sV95kaoqjzjFwuYQLtOI0RZre/Ke0nPaQV+g==",
+ "version": "4.44.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.44.0.tgz",
+ "integrity": "sha512-qC0kS48c/s3EtdArkimctY7h3nHicQeEUdjJzYVJYR3ct3kWSafmn6jkNCA8InbUdge6PVx6keqjk5lVGJf99g==",
"cpu": [
"x64"
],
@@ -4969,9 +4904,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm-gnueabihf": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.9.tgz",
- "integrity": "sha512-88I+D3TeKItrw+Y/2ud4Tw0+3CxQ2kLgu3QvrogZ0OfkmX/DEppehus7L3TS2Q4lpB+hYyxhkQiYPJ6Mf5/dPg==",
+ "version": "4.44.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.44.0.tgz",
+ "integrity": "sha512-x+e/Z9H0RAWckn4V2OZZl6EmV0L2diuX3QB0uM1r6BvhUIv6xBPL5mrAX2E3e8N8rEHVPwFfz/ETUbV4oW9+lQ==",
"cpu": [
"arm"
],
@@ -4982,9 +4917,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm-musleabihf": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.9.tgz",
- "integrity": "sha512-3qyfWljSFHi9zH0KgtEPG4cBXHDFhwD8kwg6xLfHQ0IWuH9crp005GfoUUh/6w9/FWGBwEHg3lxK1iHRN1MFlA==",
+ "version": "4.44.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.44.0.tgz",
+ "integrity": "sha512-1exwiBFf4PU/8HvI8s80icyCcnAIB86MCBdst51fwFmH5dyeoWVPVgmQPcKrMtBQ0W5pAs7jBCWuRXgEpRzSCg==",
"cpu": [
"arm"
],
@@ -4995,9 +4930,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm64-gnu": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.9.tgz",
- "integrity": "sha512-6TZjPHjKZUQKmVKMUowF3ewHxctrRR09eYyvT5eFv8w/fXarEra83A2mHTVJLA5xU91aCNOUnM+DWFMSbQ0Nxw==",
+ "version": "4.44.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.44.0.tgz",
+ "integrity": "sha512-ZTR2mxBHb4tK4wGf9b8SYg0Y6KQPjGpR4UWwTFdnmjB4qRtoATZ5dWn3KsDwGa5Z2ZBOE7K52L36J9LueKBdOQ==",
"cpu": [
"arm64"
],
@@ -5008,9 +4943,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm64-musl": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.9.tgz",
- "integrity": "sha512-LD2fytxZJZ6xzOKnMbIpgzFOuIKlxVOpiMAXawsAZ2mHBPEYOnLRK5TTEsID6z4eM23DuO88X0Tq1mErHMVq0A==",
+ "version": "4.44.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.44.0.tgz",
+ "integrity": "sha512-GFWfAhVhWGd4r6UxmnKRTBwP1qmModHtd5gkraeW2G490BpFOZkFtem8yuX2NyafIP/mGpRJgTJ2PwohQkUY/Q==",
"cpu": [
"arm64"
],
@@ -5021,9 +4956,9 @@
]
},
"node_modules/@rollup/rollup-linux-loongarch64-gnu": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.9.tgz",
- "integrity": "sha512-dRAgTfDsn0TE0HI6cmo13hemKpVHOEyeciGtvlBTkpx/F65kTvShtY/EVyZEIfxFkV5JJTuQ9tP5HGBS0hfxIg==",
+ "version": "4.44.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.44.0.tgz",
+ "integrity": "sha512-xw+FTGcov/ejdusVOqKgMGW3c4+AgqrfvzWEVXcNP6zq2ue+lsYUgJ+5Rtn/OTJf7e2CbgTFvzLW2j0YAtj0Gg==",
"cpu": [
"loong64"
],
@@ -5034,9 +4969,9 @@
]
},
"node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.9.tgz",
- "integrity": "sha512-PHcNOAEhkoMSQtMf+rJofwisZqaU8iQ8EaSps58f5HYll9EAY5BSErCZ8qBDMVbq88h4UxaNPlbrKqfWP8RfJA==",
+ "version": "4.44.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.44.0.tgz",
+ "integrity": "sha512-bKGibTr9IdF0zr21kMvkZT4K6NV+jjRnBoVMt2uNMG0BYWm3qOVmYnXKzx7UhwrviKnmK46IKMByMgvpdQlyJQ==",
"cpu": [
"ppc64"
],
@@ -5047,9 +4982,22 @@
]
},
"node_modules/@rollup/rollup-linux-riscv64-gnu": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.9.tgz",
- "integrity": "sha512-Z2i0Uy5G96KBYKjeQFKbbsB54xFOL5/y1P5wNBsbXB8yE+At3oh0DVMjQVzCJRJSfReiB2tX8T6HUFZ2k8iaKg==",
+ "version": "4.44.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.44.0.tgz",
+ "integrity": "sha512-vV3cL48U5kDaKZtXrti12YRa7TyxgKAIDoYdqSIOMOFBXqFj2XbChHAtXquEn2+n78ciFgr4KIqEbydEGPxXgA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-musl": {
+ "version": "4.44.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.44.0.tgz",
+ "integrity": "sha512-TDKO8KlHJuvTEdfw5YYFBjhFts2TR0VpZsnLLSYmB7AaohJhM8ctDSdDnUGq77hUh4m/djRafw+9zQpkOanE2Q==",
"cpu": [
"riscv64"
],
@@ -5060,9 +5008,9 @@
]
},
"node_modules/@rollup/rollup-linux-s390x-gnu": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.9.tgz",
- "integrity": "sha512-U+5SwTMoeYXoDzJX5dhDTxRltSrIax8KWwfaaYcynuJw8mT33W7oOgz0a+AaXtGuvhzTr2tVKh5UO8GVANTxyQ==",
+ "version": "4.44.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.44.0.tgz",
+ "integrity": "sha512-8541GEyktXaw4lvnGp9m84KENcxInhAt6vPWJ9RodsB/iGjHoMB2Pp5MVBCiKIRxrxzJhGCxmNzdu+oDQ7kwRA==",
"cpu": [
"s390x"
],
@@ -5073,9 +5021,9 @@
]
},
"node_modules/@rollup/rollup-linux-x64-gnu": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.9.tgz",
- "integrity": "sha512-FwBHNSOjUTQLP4MG7y6rR6qbGw4MFeQnIBrMe161QGaQoBQLqSUEKlHIiVgF3g/mb3lxlxzJOpIBhaP+C+KP2A==",
+ "version": "4.44.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.44.0.tgz",
+ "integrity": "sha512-iUVJc3c0o8l9Sa/qlDL2Z9UP92UZZW1+EmQ4xfjTc1akr0iUFZNfxrXJ/R1T90h/ILm9iXEY6+iPrmYB3pXKjw==",
"cpu": [
"x64"
],
@@ -5086,9 +5034,9 @@
]
},
"node_modules/@rollup/rollup-linux-x64-musl": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.9.tgz",
- "integrity": "sha512-cYRpV4650z2I3/s6+5/LONkjIz8MBeqrk+vPXV10ORBnshpn8S32bPqQ2Utv39jCiDcO2eJTuSlPXpnvmaIgRA==",
+ "version": "4.44.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.44.0.tgz",
+ "integrity": "sha512-PQUobbhLTQT5yz/SPg116VJBgz+XOtXt8D1ck+sfJJhuEsMj2jSej5yTdp8CvWBSceu+WW+ibVL6dm0ptG5fcA==",
"cpu": [
"x64"
],
@@ -5099,9 +5047,9 @@
]
},
"node_modules/@rollup/rollup-win32-arm64-msvc": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.9.tgz",
- "integrity": "sha512-z4mQK9dAN6byRA/vsSgQiPeuO63wdiDxZ9yg9iyX2QTzKuQM7T4xlBoeUP/J8uiFkqxkcWndWi+W7bXdPbt27Q==",
+ "version": "4.44.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.44.0.tgz",
+ "integrity": "sha512-M0CpcHf8TWn+4oTxJfh7LQuTuaYeXGbk0eageVjQCKzYLsajWS/lFC94qlRqOlyC2KvRT90ZrfXULYmukeIy7w==",
"cpu": [
"arm64"
],
@@ -5112,9 +5060,9 @@
]
},
"node_modules/@rollup/rollup-win32-ia32-msvc": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.9.tgz",
- "integrity": "sha512-KB48mPtaoHy1AwDNkAJfHXvHp24H0ryZog28spEs0V48l3H1fr4i37tiyHsgKZJnCmvxsbATdZGBpbmxTE3a9w==",
+ "version": "4.44.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.44.0.tgz",
+ "integrity": "sha512-3XJ0NQtMAXTWFW8FqZKcw3gOQwBtVWP/u8TpHP3CRPXD7Pd6s8lLdH3sHWh8vqKCyyiI8xW5ltJScQmBU9j7WA==",
"cpu": [
"ia32"
],
@@ -5125,9 +5073,9 @@
]
},
"node_modules/@rollup/rollup-win32-x64-msvc": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.9.tgz",
- "integrity": "sha512-AyleYRPU7+rgkMWbEh71fQlrzRfeP6SyMnRf9XX4fCdDPAJumdSBqYEcWPMzVQ4ScAl7E4oFfK0GUVn77xSwbw==",
+ "version": "4.44.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.44.0.tgz",
+ "integrity": "sha512-Q2Mgwt+D8hd5FIPUuPDsvPR7Bguza6yTkJxspDGkZj7tBRn2y4KSWYuIXpftFSjBra76TbKerCV7rgFPQrn+wQ==",
"cpu": [
"x64"
],
@@ -5139,14 +5087,11 @@
},
"node_modules/@sec-ant/readable-stream": {
"version": "0.4.1",
- "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz",
- "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==",
"license": "MIT"
},
"node_modules/@sideway/address": {
"version": "4.1.5",
- "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz",
- "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==",
+ "devOptional": true,
"license": "BSD-3-Clause",
"dependencies": {
"@hapi/hoek": "^9.0.0"
@@ -5154,25 +5099,22 @@
},
"node_modules/@sideway/formula": {
"version": "3.0.1",
- "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz",
- "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==",
+ "devOptional": true,
"license": "BSD-3-Clause"
},
"node_modules/@sideway/pinpoint": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz",
- "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==",
+ "devOptional": true,
"license": "BSD-3-Clause"
},
"node_modules/@sinclair/typebox": {
"version": "0.27.8",
- "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz",
- "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA=="
+ "license": "MIT",
+ "optional": true,
+ "peer": true
},
"node_modules/@sindresorhus/is": {
"version": "7.0.1",
- "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-7.0.1.tgz",
- "integrity": "sha512-QWLl2P+rsCJeofkDNIT3WFmb6NrRud1SUYW8dIhXK/46XFV8Q/g7Bsvib0Askb0reRLe+WYPeeE+l5cH7SlkuQ==",
"license": "MIT",
"engines": {
"node": ">=18"
@@ -5183,24 +5125,26 @@
},
"node_modules/@sinonjs/commons": {
"version": "3.0.1",
- "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz",
- "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==",
+ "license": "BSD-3-Clause",
+ "optional": true,
+ "peer": true,
"dependencies": {
"type-detect": "4.0.8"
}
},
"node_modules/@sinonjs/fake-timers": {
"version": "10.3.0",
- "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz",
- "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==",
+ "license": "BSD-3-Clause",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@sinonjs/commons": "^3.0.0"
}
},
"node_modules/@svgr/babel-plugin-add-jsx-attribute": {
"version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz",
- "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==",
+ "dev": true,
+ "license": "MIT",
"engines": {
"node": ">=14"
},
@@ -5214,8 +5158,8 @@
},
"node_modules/@svgr/babel-plugin-remove-jsx-attribute": {
"version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz",
- "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==",
+ "dev": true,
+ "license": "MIT",
"engines": {
"node": ">=14"
},
@@ -5229,8 +5173,8 @@
},
"node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": {
"version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz",
- "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==",
+ "dev": true,
+ "license": "MIT",
"engines": {
"node": ">=14"
},
@@ -5244,8 +5188,8 @@
},
"node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": {
"version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz",
- "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==",
+ "dev": true,
+ "license": "MIT",
"engines": {
"node": ">=14"
},
@@ -5259,8 +5203,8 @@
},
"node_modules/@svgr/babel-plugin-svg-dynamic-title": {
"version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz",
- "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==",
+ "dev": true,
+ "license": "MIT",
"engines": {
"node": ">=14"
},
@@ -5274,8 +5218,8 @@
},
"node_modules/@svgr/babel-plugin-svg-em-dimensions": {
"version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz",
- "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==",
+ "dev": true,
+ "license": "MIT",
"engines": {
"node": ">=14"
},
@@ -5289,8 +5233,8 @@
},
"node_modules/@svgr/babel-plugin-transform-react-native-svg": {
"version": "8.1.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz",
- "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==",
+ "dev": true,
+ "license": "MIT",
"engines": {
"node": ">=14"
},
@@ -5304,8 +5248,8 @@
},
"node_modules/@svgr/babel-plugin-transform-svg-component": {
"version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz",
- "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==",
+ "dev": true,
+ "license": "MIT",
"engines": {
"node": ">=12"
},
@@ -5319,8 +5263,8 @@
},
"node_modules/@svgr/babel-preset": {
"version": "8.1.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz",
- "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
"@svgr/babel-plugin-add-jsx-attribute": "8.0.0",
"@svgr/babel-plugin-remove-jsx-attribute": "8.0.0",
@@ -5344,8 +5288,8 @@
},
"node_modules/@svgr/core": {
"version": "8.1.0",
- "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz",
- "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
"@babel/core": "^7.21.3",
"@svgr/babel-preset": "8.1.0",
@@ -5363,13 +5307,13 @@
},
"node_modules/@svgr/core/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,
+ "license": "Python-2.0"
},
"node_modules/@svgr/core/node_modules/cosmiconfig": {
"version": "8.3.6",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz",
- "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
"import-fresh": "^3.3.0",
"js-yaml": "^4.1.0",
@@ -5393,8 +5337,8 @@
},
"node_modules/@svgr/core/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,
+ "license": "MIT",
"dependencies": {
"argparse": "^2.0.1"
},
@@ -5404,8 +5348,8 @@
},
"node_modules/@svgr/hast-util-to-babel-ast": {
"version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz",
- "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
"@babel/types": "^7.21.3",
"entities": "^4.4.0"
@@ -5420,8 +5364,8 @@
},
"node_modules/@svgr/plugin-jsx": {
"version": "8.1.0",
- "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz",
- "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
"@babel/core": "^7.21.3",
"@svgr/babel-preset": "8.1.0",
@@ -5441,8 +5385,6 @@
},
"node_modules/@swc/core": {
"version": "1.11.7",
- "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.11.7.tgz",
- "integrity": "sha512-ICuzjyfz8Hh3U16Mb21uCRJeJd/lUgV999GjgvPhJSISM1L8GDSB5/AMNcwuGs7gFywTKI4vAeeXWyCETUXHAg==",
"hasInstallScript": true,
"license": "Apache-2.0",
"dependencies": {
@@ -5477,198 +5419,59 @@
}
}
},
- "node_modules/@swc/core-darwin-arm64": {
+ "node_modules/@swc/core-linux-x64-gnu": {
"version": "1.11.7",
- "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.11.7.tgz",
- "integrity": "sha512-3+LhCP2H50CLI6yv/lhOtoZ5B/hi7Q/23dye1KhbSDeDprLTm/KfLJh/iQqwaHUponf5m8C2U0y6DD+HGLz8Yw==",
"cpu": [
- "arm64"
+ "x64"
],
"license": "Apache-2.0 AND MIT",
"optional": true,
"os": [
- "darwin"
+ "linux"
],
"engines": {
"node": ">=10"
}
},
- "node_modules/@swc/core-darwin-x64": {
+ "node_modules/@swc/core-linux-x64-musl": {
"version": "1.11.7",
- "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.11.7.tgz",
- "integrity": "sha512-1diWpJqwX1XmOghf9ENFaeRaTtqLiqlZIW56RfOqmeZ7tPp3qS7VygWb9akptBsO5pEA5ZwNgSerD6AJlQcjAw==",
"cpu": [
"x64"
],
"license": "Apache-2.0 AND MIT",
"optional": true,
"os": [
- "darwin"
+ "linux"
],
"engines": {
"node": ">=10"
}
},
- "node_modules/@swc/core-linux-arm-gnueabihf": {
- "version": "1.11.7",
- "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.11.7.tgz",
- "integrity": "sha512-MV8+hLREf0NN23NuSKemsjFaWjl/HnqdOkE7uhXTnHzg8WTwp6ddVtU5Yriv15+d/ktfLWPVAOhLHQ4gzaoa8A==",
- "cpu": [
- "arm"
- ],
+ "node_modules/@swc/counter": {
+ "version": "0.1.3",
+ "license": "Apache-2.0"
+ },
+ "node_modules/@swc/types": {
+ "version": "0.1.19",
"license": "Apache-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=10"
+ "dependencies": {
+ "@swc/counter": "^0.1.3"
}
},
- "node_modules/@swc/core-linux-arm64-gnu": {
- "version": "1.11.7",
- "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.11.7.tgz",
- "integrity": "sha512-5GNs8ZjHQy/UTSnzzn+gm1RCUpCYo43lsxYOl8mpcnZSfxkNFVpjfylBv0QuJ5qhdfZ2iU55+v4iJCwCMtw0nA==",
- "cpu": [
- "arm64"
- ],
- "license": "Apache-2.0 AND MIT",
- "optional": true,
- "os": [
- "linux"
- ],
+ "node_modules/@szmarczak/http-timer": {
+ "version": "5.0.1",
+ "license": "MIT",
+ "dependencies": {
+ "defer-to-connect": "^2.0.1"
+ },
"engines": {
- "node": ">=10"
- }
- },
- "node_modules/@swc/core-linux-arm64-musl": {
- "version": "1.11.7",
- "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.11.7.tgz",
- "integrity": "sha512-cTydaYBwDbVV5CspwVcCp9IevYWpGD1cF5B5KlBdjmBzxxeWyTAJRtKzn8w5/UJe/MfdAptarpqMPIs2f33YEQ==",
- "cpu": [
- "arm64"
- ],
- "license": "Apache-2.0 AND MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/@swc/core-linux-x64-gnu": {
- "version": "1.11.7",
- "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.11.7.tgz",
- "integrity": "sha512-YAX2KfYPlbDsnZiVMI4ZwotF3VeURUrzD+emJgFf1g26F4eEmslldgnDrKybW7V+bObsH22cDqoy6jmQZgpuPQ==",
- "cpu": [
- "x64"
- ],
- "license": "Apache-2.0 AND MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/@swc/core-linux-x64-musl": {
- "version": "1.11.7",
- "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.11.7.tgz",
- "integrity": "sha512-mYT6FTDZyYx5pailc8xt6ClS2yjKmP8jNHxA9Ce3K21n5qkKilI5M2N7NShwXkd3Ksw3F29wKrg+wvEMXTRY/A==",
- "cpu": [
- "x64"
- ],
- "license": "Apache-2.0 AND MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/@swc/core-win32-arm64-msvc": {
- "version": "1.11.7",
- "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.11.7.tgz",
- "integrity": "sha512-uLDQEcv0BHcepypstyxKkNsW6KfLyI5jVxTbcxka+B2UnMcFpvoR87nGt2JYW0grO2SNZPoFz+UnoKL9c6JxpA==",
- "cpu": [
- "arm64"
- ],
- "license": "Apache-2.0 AND MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/@swc/core-win32-ia32-msvc": {
- "version": "1.11.7",
- "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.11.7.tgz",
- "integrity": "sha512-wiq5G3fRizdxAJVFcon7zpyfbfrb+YShuTy+TqJ4Nf5PC0ueMOXmsmeuyQGApn6dVWtGCyymYQYt77wHeQajdA==",
- "cpu": [
- "ia32"
- ],
- "license": "Apache-2.0 AND MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/@swc/core-win32-x64-msvc": {
- "version": "1.11.7",
- "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.11.7.tgz",
- "integrity": "sha512-/zQdqY4fHkSORxEJ2cKtRBOwglvf/8gs6Tl4Q6VMx2zFtFpIOwFQstfY5u8wBNN2Z+PkAzyUCPoi8/cQFK8HLQ==",
- "cpu": [
- "x64"
- ],
- "license": "Apache-2.0 AND MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/@swc/counter": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz",
- "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==",
- "license": "Apache-2.0"
- },
- "node_modules/@swc/types": {
- "version": "0.1.19",
- "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.19.tgz",
- "integrity": "sha512-WkAZaAfj44kh/UFdAQcrMP1I0nwRqpt27u+08LMBYMqmQfwwMofYoMh/48NGkMMRfC4ynpfwRbJuu8ErfNloeA==",
- "license": "Apache-2.0",
- "dependencies": {
- "@swc/counter": "^0.1.3"
- }
- },
- "node_modules/@szmarczak/http-timer": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz",
- "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==",
- "license": "MIT",
- "dependencies": {
- "defer-to-connect": "^2.0.1"
- },
- "engines": {
- "node": ">=14.16"
+ "node": ">=14.16"
}
},
"node_modules/@testing-library/dom": {
"version": "8.20.1",
- "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.20.1.tgz",
- "integrity": "sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@babel/code-frame": "^7.10.4",
"@babel/runtime": "^7.12.5",
@@ -5683,81 +5486,10 @@
"node": ">=12"
}
},
- "node_modules/@testing-library/dom/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/@testing-library/dom/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/@testing-library/dom/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/@testing-library/dom/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/@testing-library/dom/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/@testing-library/dom/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/@testing-library/react": {
"version": "13.4.0",
- "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-13.4.0.tgz",
- "integrity": "sha512-sXOGON+WNTh3MLE9rve97ftaZukN3oNf2KjDy7YTx6hcTO2uuLHuCGynMDhFwGw/jYf4OJ2Qk0i4i79qMNNkyw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@babel/runtime": "^7.12.5",
"@testing-library/dom": "^8.5.0",
@@ -5773,20 +5505,15 @@
},
"node_modules/@types/aria-query": {
"version": "5.0.4",
- "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz",
- "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/@types/aws-lambda": {
"version": "8.10.147",
- "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.147.tgz",
- "integrity": "sha512-nD0Z9fNIZcxYX5Mai2CTmFD7wX7UldCkW2ezCF8D1T5hdiLsnTWDGRpfRYntU6VjTdLQjOvyszru7I1c1oCQew==",
"license": "MIT"
},
"node_modules/@types/body-parser": {
"version": "1.19.5",
- "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz",
- "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -5796,43 +5523,48 @@
},
"node_modules/@types/connect": {
"version": "3.4.38",
- "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz",
- "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/node": "*"
}
},
+ "node_modules/@types/cypress": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/@types/cypress/-/cypress-1.1.6.tgz",
+ "integrity": "sha512-CfeLLD3+6vIWe2AO5hR63f1c8EbRzrp/j1ExubAwOTpwZFZvF3Nm9cOPQiUwzNmAUmZuhO0QVH98Qlujni6nPw==",
+ "deprecated": "This is a stub types definition. cypress provides its own type definitions, so you do not need this installed.",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "cypress": "*"
+ }
+ },
"node_modules/@types/cytoscape": {
"version": "3.19.16",
- "resolved": "https://registry.npmjs.org/@types/cytoscape/-/cytoscape-3.19.16.tgz",
- "integrity": "sha512-A3zkjaZ6cOGyqEvrVuC1YUgiRSJhDZOj8Qhd1ALH2/+YxH2za1BOmR4RWQsKYHsc+aMP/IWoqg1COuUbZ39t/g=="
+ "license": "MIT"
},
"node_modules/@types/debounce": {
"version": "1.2.4",
- "resolved": "https://registry.npmjs.org/@types/debounce/-/debounce-1.2.4.tgz",
- "integrity": "sha512-jBqiORIzKDOToaF63Fm//haOCHuwQuLa2202RK4MozpA6lh93eCBc+/8+wZn5OzjJt3ySdc+74SXWXB55Ewtyw==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/@types/debug": {
"version": "4.1.12",
- "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz",
- "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==",
+ "license": "MIT",
"dependencies": {
"@types/ms": "*"
}
},
"node_modules/@types/estree": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
- "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
"license": "MIT"
},
"node_modules/@types/express": {
"version": "5.0.2",
- "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.2.tgz",
- "integrity": "sha512-BtjL3ZwbCQriyb0DGw+Rt12qAXPiBTPs815lsUvtt1Grk0vLRMZNMUZ741d5rjk+UQOxfDiBZ3dxpX00vSkK3g==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -5843,8 +5575,6 @@
},
"node_modules/@types/express-serve-static-core": {
"version": "5.0.6",
- "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz",
- "integrity": "sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -5856,8 +5586,6 @@
},
"node_modules/@types/got": {
"version": "9.6.12",
- "resolved": "https://registry.npmjs.org/@types/got/-/got-9.6.12.tgz",
- "integrity": "sha512-X4pj/HGHbXVLqTpKjA2ahI4rV/nNBc9mGO2I/0CgAra+F2dKgMXnENv2SRpemScBzBAI4vMelIVYViQxlSE6xA==",
"license": "MIT",
"dependencies": {
"@types/node": "*",
@@ -5867,8 +5595,6 @@
},
"node_modules/@types/got/node_modules/form-data": {
"version": "2.5.3",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.3.tgz",
- "integrity": "sha512-XHIrMD0NpDrNM/Ckf7XJiBbLl57KEhT3+i3yY+eWm+cqYZJQTZrKo8Y8AWKnuV5GT4scfuUGt9LzNoIx3dU1nQ==",
"license": "MIT",
"dependencies": {
"asynckit": "^0.4.0",
@@ -5883,21 +5609,18 @@
},
"node_modules/@types/hast": {
"version": "2.3.10",
- "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz",
- "integrity": "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==",
+ "license": "MIT",
"dependencies": {
"@types/unist": "^2"
}
},
"node_modules/@types/history": {
"version": "4.7.11",
- "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz",
- "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA=="
+ "license": "MIT"
},
"node_modules/@types/hoist-non-react-statics": {
"version": "3.3.5",
- "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz",
- "integrity": "sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==",
+ "license": "MIT",
"dependencies": {
"@types/react": "*",
"hoist-non-react-statics": "^3.3.0"
@@ -5905,105 +5628,96 @@
},
"node_modules/@types/http-cache-semantics": {
"version": "4.0.4",
- "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz",
- "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==",
"license": "MIT"
},
"node_modules/@types/http-errors": {
"version": "2.0.4",
- "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz",
- "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==",
"dev": true,
"license": "MIT"
},
"node_modules/@types/istanbul-lib-coverage": {
"version": "2.0.6",
- "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz",
- "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w=="
+ "license": "MIT",
+ "optional": true,
+ "peer": true
},
"node_modules/@types/istanbul-lib-report": {
"version": "3.0.3",
- "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz",
- "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@types/istanbul-lib-coverage": "*"
}
},
"node_modules/@types/istanbul-reports": {
"version": "3.0.4",
- "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz",
- "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@types/istanbul-lib-report": "*"
}
},
"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
+ "dev": true,
+ "license": "MIT"
},
"node_modules/@types/katex": {
"version": "0.14.0",
- "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.14.0.tgz",
- "integrity": "sha512-+2FW2CcT0K3P+JMR8YG846bmDwplKUTsWgT2ENwdQ1UdVfRk3GQrh6Mi4sTopy30gI8Uau5CEqHTDZ6YvWIUPA=="
+ "license": "MIT"
+ },
+ "node_modules/@types/mathjax": {
+ "version": "0.0.40",
+ "resolved": "https://registry.npmjs.org/@types/mathjax/-/mathjax-0.0.40.tgz",
+ "integrity": "sha512-rHusx08LCg92WJxrsM3SPjvLTSvK5C+gealtSuhKbEOcUZfWlwigaFoPLf6Dfxhg4oryN5qP9Sj7zOQ4HYXINw==",
+ "license": "MIT"
},
"node_modules/@types/mdast": {
"version": "3.0.15",
- "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz",
- "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==",
+ "license": "MIT",
"dependencies": {
"@types/unist": "^2"
}
},
"node_modules/@types/mime": {
"version": "1.3.5",
- "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz",
- "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==",
"dev": true,
"license": "MIT"
},
"node_modules/@types/ms": {
"version": "0.7.34",
- "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz",
- "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g=="
+ "license": "MIT"
},
"node_modules/@types/node": {
"version": "20.11.16",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.16.tgz",
- "integrity": "sha512-gKb0enTmRCzXSSUJDq6/sPcqrfCv2mkkG6Jt/clpn5eiCbKTY+SgZUxo+p8ZKMof5dCp9vHQUAB7wOUTod22wQ==",
+ "license": "MIT",
"dependencies": {
"undici-types": "~5.26.4"
}
},
"node_modules/@types/parse-json": {
"version": "4.0.2",
- "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz",
- "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw=="
+ "license": "MIT"
},
"node_modules/@types/prop-types": {
"version": "15.7.11",
- "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz",
- "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng=="
+ "license": "MIT"
},
"node_modules/@types/qs": {
"version": "6.14.0",
- "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz",
- "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==",
"dev": true,
"license": "MIT"
},
"node_modules/@types/range-parser": {
"version": "1.2.7",
- "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz",
- "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==",
"dev": true,
"license": "MIT"
},
"node_modules/@types/react": {
"version": "18.2.55",
- "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.55.tgz",
- "integrity": "sha512-Y2Tz5P4yz23brwm2d7jNon39qoAtMMmalOQv6+fEFt1mT+FcM3D841wDpoUvFXhaYenuROCy3FZYqdTjM7qVyA==",
+ "license": "MIT",
"dependencies": {
"@types/prop-types": "*",
"@types/scheduler": "*",
@@ -6012,17 +5726,15 @@
},
"node_modules/@types/react-dom": {
"version": "18.2.18",
- "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.18.tgz",
- "integrity": "sha512-TJxDm6OfAX2KJWJdMEVTwWke5Sc/E/RlnPGvGfS0W7+6ocy2xhDVQVh/KvC2Uf7kACs+gDytdusDSdWfWkaNzw==",
"devOptional": true,
+ "license": "MIT",
"dependencies": {
"@types/react": "*"
}
},
"node_modules/@types/react-router": {
"version": "5.1.20",
- "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz",
- "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==",
+ "license": "MIT",
"dependencies": {
"@types/history": "^4.7.11",
"@types/react": "*"
@@ -6030,8 +5742,7 @@
},
"node_modules/@types/react-router-dom": {
"version": "5.3.3",
- "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz",
- "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==",
+ "license": "MIT",
"dependencies": {
"@types/history": "^4.7.11",
"@types/react": "*",
@@ -6040,21 +5751,17 @@
},
"node_modules/@types/react-transition-group": {
"version": "4.4.10",
- "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz",
- "integrity": "sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==",
+ "license": "MIT",
"dependencies": {
"@types/react": "*"
}
},
"node_modules/@types/scheduler": {
"version": "0.16.8",
- "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz",
- "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A=="
+ "license": "MIT"
},
"node_modules/@types/send": {
"version": "0.17.4",
- "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz",
- "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -6064,8 +5771,6 @@
},
"node_modules/@types/serve-static": {
"version": "1.15.7",
- "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz",
- "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -6074,2486 +5779,3988 @@
"@types/send": "*"
}
},
+ "node_modules/@types/sinonjs__fake-timers": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz",
+ "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/sizzle": {
+ "version": "2.3.9",
+ "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.9.tgz",
+ "integrity": "sha512-xzLEyKB50yqCUPUJkIsrVvoWNfFUbIZI+RspLWt8u+tIW/BetMBZtgV2LY/2o+tYH8dRvQ+eoPf3NdhQCcLE2w==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/@types/stack-utils": {
"version": "2.0.3",
- "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz",
- "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw=="
+ "license": "MIT",
+ "optional": true,
+ "peer": true
},
"node_modules/@types/tough-cookie": {
"version": "4.0.5",
- "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz",
- "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/trusted-types": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz",
+ "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==",
"license": "MIT"
},
"node_modules/@types/unist": {
"version": "2.0.10",
- "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
- "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA=="
+ "license": "MIT"
},
"node_modules/@types/use-sync-external-store": {
"version": "0.0.3",
- "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz",
- "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA=="
+ "license": "MIT"
+ },
+ "node_modules/@types/ws": {
+ "version": "8.18.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/yargs": {
+ "version": "17.0.32",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/@types/yargs-parser": {
+ "version": "21.0.3",
+ "license": "MIT",
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/@types/yauzl": {
+ "version": "2.10.3",
+ "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz",
+ "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@ungap/structured-clone": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz",
+ "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==",
+ "license": "ISC"
+ },
+ "node_modules/@vitejs/plugin-react-swc": {
+ "version": "3.8.0",
+ "license": "MIT",
+ "dependencies": {
+ "@swc/core": "^1.10.15"
+ },
+ "peerDependencies": {
+ "vite": "^4 || ^5 || ^6"
+ }
+ },
+ "node_modules/@vscode-elements/elements": {
+ "version": "1.7.1",
+ "resolved": "https://registry.npmjs.org/@vscode-elements/elements/-/elements-1.7.1.tgz",
+ "integrity": "sha512-3iKAO+B5u/UKXVPOvnlpzFTCCh0lrESgonerNf6EOz2XgnBTBLC01qCHXTXTnFf/foSrcKEnLY7REZOnwZSe3A==",
+ "license": "MIT",
+ "dependencies": {
+ "lit": "^3.2.0"
+ }
+ },
+ "node_modules/@vscode-elements/react-elements": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/@vscode-elements/react-elements/-/react-elements-0.5.0.tgz",
+ "integrity": "sha512-+H1aKuD7uID8Dc/YiQCQUFtGcWxCX+rWH9EIcQTUB1Gj8SfQrwN4Cd46BqQbwJAwtYJkOMl9i+Urfc5mkw8HWw==",
+ "license": "ISC",
+ "dependencies": {
+ "@lit/react": "^1.0.6",
+ "@vscode-elements/elements": "~1.7.0",
+ "react": "~18.0.0"
+ }
+ },
+ "node_modules/@vscode-elements/react-elements/node_modules/react": {
+ "version": "18.0.0",
+ "resolved": "https://registry.npmjs.org/react/-/react-18.0.0.tgz",
+ "integrity": "sha512-x+VL6wbT4JRVPm7EGxXhZ8w8LTROaxPXOqhlGyVSrv0sB1jkyFGgXxJ8LVoPRLvPR6/CIZGFmfzqUa2NYeMr2A==",
+ "license": "MIT",
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@vscode/codicons": {
+ "version": "0.0.32",
+ "license": "CC-BY-4.0"
+ },
+ "node_modules/@vscode/iconv-lite-umd": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/@vscode/iconv-lite-umd/-/iconv-lite-umd-0.7.0.tgz",
+ "integrity": "sha512-bRRFxLfg5dtAyl5XyiVWz/ZBPahpOpPrNYnnHpOpUZvam4tKH35wdhP4Kj6PbM0+KdliOsPzbGWpkxcdpNB/sg==",
+ "license": "MIT"
+ },
+ "node_modules/@vscode/webview-ui-toolkit": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/@vscode/webview-ui-toolkit/-/webview-ui-toolkit-1.4.0.tgz",
+ "integrity": "sha512-modXVHQkZLsxgmd5yoP3ptRC/G8NBDD+ob+ngPiWNQdlrH6H1xR/qgOBD85bfU3BhOB5sZzFWBwwhp9/SfoHww==",
+ "deprecated": "This package has been deprecated, https://github.com/microsoft/vscode-webview-ui-toolkit/issues/561",
+ "license": "MIT",
+ "dependencies": {
+ "@microsoft/fast-element": "^1.12.0",
+ "@microsoft/fast-foundation": "^2.49.4",
+ "@microsoft/fast-react-wrapper": "^0.3.22",
+ "tslib": "^2.6.2"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0"
+ }
+ },
+ "node_modules/@webassemblyjs/ast": {
+ "version": "1.12.1",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@webassemblyjs/helper-numbers": "1.11.6",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.6"
+ }
+ },
+ "node_modules/@webassemblyjs/floating-point-hex-parser": {
+ "version": "1.11.6",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@webassemblyjs/helper-api-error": {
+ "version": "1.11.6",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@webassemblyjs/helper-buffer": {
+ "version": "1.12.1",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@webassemblyjs/helper-numbers": {
+ "version": "1.11.6",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@webassemblyjs/floating-point-hex-parser": "1.11.6",
+ "@webassemblyjs/helper-api-error": "1.11.6",
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@webassemblyjs/helper-wasm-bytecode": {
+ "version": "1.11.6",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@webassemblyjs/helper-wasm-section": {
+ "version": "1.12.1",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.12.1",
+ "@webassemblyjs/helper-buffer": "1.12.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
+ "@webassemblyjs/wasm-gen": "1.12.1"
+ }
+ },
+ "node_modules/@webassemblyjs/ieee754": {
+ "version": "1.11.6",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@xtuc/ieee754": "^1.2.0"
+ }
+ },
+ "node_modules/@webassemblyjs/leb128": {
+ "version": "1.11.6",
+ "dev": true,
+ "license": "Apache-2.0",
+ "peer": true,
+ "dependencies": {
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@webassemblyjs/utf8": {
+ "version": "1.11.6",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@webassemblyjs/wasm-edit": {
+ "version": "1.12.1",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.12.1",
+ "@webassemblyjs/helper-buffer": "1.12.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
+ "@webassemblyjs/helper-wasm-section": "1.12.1",
+ "@webassemblyjs/wasm-gen": "1.12.1",
+ "@webassemblyjs/wasm-opt": "1.12.1",
+ "@webassemblyjs/wasm-parser": "1.12.1",
+ "@webassemblyjs/wast-printer": "1.12.1"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-gen": {
+ "version": "1.12.1",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.12.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
+ "@webassemblyjs/ieee754": "1.11.6",
+ "@webassemblyjs/leb128": "1.11.6",
+ "@webassemblyjs/utf8": "1.11.6"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-opt": {
+ "version": "1.12.1",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.12.1",
+ "@webassemblyjs/helper-buffer": "1.12.1",
+ "@webassemblyjs/wasm-gen": "1.12.1",
+ "@webassemblyjs/wasm-parser": "1.12.1"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-parser": {
+ "version": "1.12.1",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.12.1",
+ "@webassemblyjs/helper-api-error": "1.11.6",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
+ "@webassemblyjs/ieee754": "1.11.6",
+ "@webassemblyjs/leb128": "1.11.6",
+ "@webassemblyjs/utf8": "1.11.6"
+ }
+ },
+ "node_modules/@webassemblyjs/wast-printer": {
+ "version": "1.12.1",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.12.1",
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@xmldom/xmldom": {
+ "version": "0.9.8",
+ "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.9.8.tgz",
+ "integrity": "sha512-p96FSY54r+WJ50FIOsCOjyj/wavs8921hG5+kVMmZgKcvIKxMXHTrjNJvRgWa/zuX3B6t2lijLNFaOyuxUH+2A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.6"
+ }
+ },
+ "node_modules/@xtuc/ieee754": {
+ "version": "1.2.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "peer": true
+ },
+ "node_modules/@xtuc/long": {
+ "version": "4.2.2",
+ "dev": true,
+ "license": "Apache-2.0",
+ "peer": true
+ },
+ "node_modules/abbrev": {
+ "version": "1.1.1",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/abort-controller": {
+ "version": "3.0.0",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "event-target-shim": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=6.5"
+ }
+ },
+ "node_modules/accepts": {
+ "version": "1.3.8",
+ "license": "MIT",
+ "dependencies": {
+ "mime-types": "~2.1.34",
+ "negotiator": "0.6.3"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.11.3",
+ "devOptional": true,
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-class-fields": {
+ "version": "0.3.7",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "acorn-private-class-elements": "^0.2.7"
+ },
+ "engines": {
+ "node": ">=4.8.2"
+ },
+ "peerDependencies": {
+ "acorn": "^6 || ^7 || ^8"
+ }
+ },
+ "node_modules/acorn-import-attributes": {
+ "version": "1.9.5",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "peerDependencies": {
+ "acorn": "^8"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/acorn-private-class-elements": {
+ "version": "0.2.7",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.8.2"
+ },
+ "peerDependencies": {
+ "acorn": "^6.1.0 || ^7 || ^8"
+ }
+ },
+ "node_modules/acorn-private-methods": {
+ "version": "0.3.3",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "acorn-private-class-elements": "^0.2.7"
+ },
+ "engines": {
+ "node": ">=4.8.2"
+ },
+ "peerDependencies": {
+ "acorn": "^6 || ^7 || ^8"
+ }
+ },
+ "node_modules/acorn-stage3": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "acorn-class-fields": "^0.3.7",
+ "acorn-private-methods": "^0.3.3",
+ "acorn-static-class-features": "^0.2.4"
+ },
+ "engines": {
+ "node": ">=4.8.2"
+ },
+ "peerDependencies": {
+ "acorn": "^7.4 || ^8"
+ }
+ },
+ "node_modules/acorn-static-class-features": {
+ "version": "0.2.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "acorn-private-class-elements": "^0.2.7"
+ },
+ "engines": {
+ "node": ">=4.8.2"
+ },
+ "peerDependencies": {
+ "acorn": "^6.1.0 || ^7 || ^8"
+ }
+ },
+ "node_modules/acorn-walk": {
+ "version": "8.3.2",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/aggregate-error": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
+ "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "clean-stack": "^2.0.0",
+ "indent-string": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.12.6",
+ "license": "MIT",
+ "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/ajv-keywords": {
+ "version": "3.5.2",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "ajv": "^6.9.1"
+ }
+ },
+ "node_modules/anser": {
+ "version": "1.4.10",
+ "license": "MIT",
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/ansi-colors": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz",
+ "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ansi-escapes": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
+ "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "type-fest": "^0.21.3"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ansi-escapes/node_modules/type-fest": {
+ "version": "0.21.3",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
+ "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ansi-fragments": {
+ "version": "0.2.1",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "colorette": "^1.0.7",
+ "slice-ansi": "^2.0.0",
+ "strip-ansi": "^5.0.0"
+ }
+ },
+ "node_modules/ansi-html-community": {
+ "version": "0.0.8",
+ "dev": true,
+ "engines": [
+ "node >= 0.8.0"
+ ],
+ "license": "Apache-2.0",
+ "bin": {
+ "ansi-html": "bin/ansi-html"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "devOptional": true,
+ "license": "ISC",
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/appdirsjs": {
+ "version": "1.2.7",
+ "license": "MIT",
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/arch": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz",
+ "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==",
+ "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"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/argparse": {
+ "version": "1.0.10",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "node_modules/aria-query": {
+ "version": "5.1.3",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "deep-equal": "^2.0.5"
+ }
+ },
+ "node_modules/array-buffer-byte-length": {
+ "version": "1.0.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.5",
+ "is-array-buffer": "^3.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array-flatten": {
+ "version": "1.1.1",
+ "license": "MIT"
+ },
+ "node_modules/asap": {
+ "version": "2.0.6",
+ "license": "MIT",
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/asn1": {
+ "version": "0.2.6",
+ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
+ "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": "~2.1.0"
+ }
+ },
+ "node_modules/asn1.js": {
+ "version": "4.10.1",
+ "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz",
+ "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "bn.js": "^4.0.0",
+ "inherits": "^2.0.1",
+ "minimalistic-assert": "^1.0.0"
+ }
+ },
+ "node_modules/asn1.js/node_modules/bn.js": {
+ "version": "4.12.2",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz",
+ "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/assert": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz",
+ "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "is-nan": "^1.3.2",
+ "object-is": "^1.1.5",
+ "object.assign": "^4.1.4",
+ "util": "^0.12.5"
+ }
+ },
+ "node_modules/assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/ast-types": {
+ "version": "0.15.2",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "tslib": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/astral-regex": {
+ "version": "1.0.0",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/async": {
+ "version": "3.2.6",
+ "devOptional": true,
+ "license": "MIT"
+ },
+ "node_modules/async-limiter": {
+ "version": "1.0.1",
+ "license": "MIT",
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "license": "MIT"
+ },
+ "node_modules/at-least-node": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
+ "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/available-typed-arrays": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
+ "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "possible-typed-array-names": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/aws-sign2": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
+ "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/aws4": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz",
+ "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==",
+ "license": "MIT"
+ },
+ "node_modules/axios": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.10.0.tgz",
+ "integrity": "sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==",
+ "license": "MIT",
+ "dependencies": {
+ "follow-redirects": "^1.15.6",
+ "form-data": "^4.0.0",
+ "proxy-from-env": "^1.1.0"
+ }
+ },
+ "node_modules/axios/node_modules/proxy-from-env": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
+ "license": "MIT"
+ },
+ "node_modules/babel-core": {
+ "version": "7.0.0-bridge.0",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/babel-plugin-macros": {
+ "version": "3.1.0",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.12.5",
+ "cosmiconfig": "^7.0.0",
+ "resolve": "^1.19.0"
+ },
+ "engines": {
+ "node": ">=10",
+ "npm": ">=6"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-corejs2": {
+ "version": "0.4.11",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@babel/compat-data": "^7.22.6",
+ "@babel/helper-define-polyfill-provider": "^0.6.2",
+ "semver": "^6.3.1"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-corejs2/node_modules/@babel/helper-define-polyfill-provider": {
+ "version": "0.6.2",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.22.6",
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "debug": "^4.1.1",
+ "lodash.debounce": "^4.0.8",
+ "resolve": "^1.14.2"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-corejs3": {
+ "version": "0.9.0",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-define-polyfill-provider": "^0.5.0",
+ "core-js-compat": "^3.34.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-regenerator": {
+ "version": "0.5.5",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@babel/helper-define-polyfill-provider": "^0.5.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/babel-plugin-syntax-trailing-function-commas": {
+ "version": "7.0.0-beta.0",
+ "license": "MIT",
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/babel-plugin-transform-flow-enums": {
+ "version": "0.0.2",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@babel/plugin-syntax-flow": "^7.12.1"
+ }
+ },
+ "node_modules/babel-preset-fbjs": {
+ "version": "3.4.0",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@babel/plugin-proposal-class-properties": "^7.0.0",
+ "@babel/plugin-proposal-object-rest-spread": "^7.0.0",
+ "@babel/plugin-syntax-class-properties": "^7.0.0",
+ "@babel/plugin-syntax-flow": "^7.0.0",
+ "@babel/plugin-syntax-jsx": "^7.0.0",
+ "@babel/plugin-syntax-object-rest-spread": "^7.0.0",
+ "@babel/plugin-transform-arrow-functions": "^7.0.0",
+ "@babel/plugin-transform-block-scoped-functions": "^7.0.0",
+ "@babel/plugin-transform-block-scoping": "^7.0.0",
+ "@babel/plugin-transform-classes": "^7.0.0",
+ "@babel/plugin-transform-computed-properties": "^7.0.0",
+ "@babel/plugin-transform-destructuring": "^7.0.0",
+ "@babel/plugin-transform-flow-strip-types": "^7.0.0",
+ "@babel/plugin-transform-for-of": "^7.0.0",
+ "@babel/plugin-transform-function-name": "^7.0.0",
+ "@babel/plugin-transform-literals": "^7.0.0",
+ "@babel/plugin-transform-member-expression-literals": "^7.0.0",
+ "@babel/plugin-transform-modules-commonjs": "^7.0.0",
+ "@babel/plugin-transform-object-super": "^7.0.0",
+ "@babel/plugin-transform-parameters": "^7.0.0",
+ "@babel/plugin-transform-property-literals": "^7.0.0",
+ "@babel/plugin-transform-react-display-name": "^7.0.0",
+ "@babel/plugin-transform-react-jsx": "^7.0.0",
+ "@babel/plugin-transform-shorthand-properties": "^7.0.0",
+ "@babel/plugin-transform-spread": "^7.0.0",
+ "@babel/plugin-transform-template-literals": "^7.0.0",
+ "babel-plugin-syntax-trailing-function-commas": "^7.0.0-beta.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/bail": {
+ "version": "2.0.2",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "license": "MIT"
+ },
+ "node_modules/bare-events": {
+ "version": "2.2.2",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true
+ },
+ "node_modules/base64-js": {
+ "version": "1.5.1",
+ "devOptional": 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"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/bcrypt-pbkdf": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
+ "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "tweetnacl": "^0.14.3"
+ }
+ },
+ "node_modules/before-after-hook": {
+ "version": "3.0.2",
+ "license": "Apache-2.0"
+ },
+ "node_modules/big.js": {
+ "version": "5.2.2",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.2.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/bl": {
+ "version": "4.1.0",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "buffer": "^5.5.0",
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.4.0"
+ }
+ },
+ "node_modules/blob-util": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz",
+ "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/bluebird": {
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
+ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/bn.js": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz",
+ "integrity": "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/body-parser": {
+ "version": "1.20.3",
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "3.1.2",
+ "content-type": "~1.0.5",
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "1.2.0",
+ "http-errors": "2.0.0",
+ "iconv-lite": "0.4.24",
+ "on-finished": "2.4.1",
+ "qs": "6.13.0",
+ "raw-body": "2.5.2",
+ "type-is": "~1.6.18",
+ "unpipe": "1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
+ }
+ },
+ "node_modules/body-parser/node_modules/debug": {
+ "version": "2.6.9",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/body-parser/node_modules/ms": {
+ "version": "2.0.0",
+ "license": "MIT"
+ },
+ "node_modules/boolbase": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
+ "license": "ISC"
+ },
+ "node_modules/bottleneck": {
+ "version": "2.19.5",
+ "license": "MIT"
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/brorand": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
+ "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/browser-resolve": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-2.0.0.tgz",
+ "integrity": "sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "resolve": "^1.17.0"
+ }
+ },
+ "node_modules/browserify-aes": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
+ "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "buffer-xor": "^1.0.3",
+ "cipher-base": "^1.0.0",
+ "create-hash": "^1.1.0",
+ "evp_bytestokey": "^1.0.3",
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/browserify-cipher": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz",
+ "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "browserify-aes": "^1.0.4",
+ "browserify-des": "^1.0.0",
+ "evp_bytestokey": "^1.0.0"
+ }
+ },
+ "node_modules/browserify-des": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz",
+ "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cipher-base": "^1.0.1",
+ "des.js": "^1.0.0",
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.1.2"
+ }
+ },
+ "node_modules/browserify-rsa": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.1.tgz",
+ "integrity": "sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "bn.js": "^5.2.1",
+ "randombytes": "^2.1.0",
+ "safe-buffer": "^5.2.1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/browserify-sign": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.3.tgz",
+ "integrity": "sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "bn.js": "^5.2.1",
+ "browserify-rsa": "^4.1.0",
+ "create-hash": "^1.2.0",
+ "create-hmac": "^1.1.7",
+ "elliptic": "^6.5.5",
+ "hash-base": "~3.0",
+ "inherits": "^2.0.4",
+ "parse-asn1": "^5.1.7",
+ "readable-stream": "^2.3.8",
+ "safe-buffer": "^5.2.1"
+ },
+ "engines": {
+ "node": ">= 0.12"
+ }
+ },
+ "node_modules/browserify-sign/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,
+ "license": "MIT"
+ },
+ "node_modules/browserify-sign/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,
+ "license": "MIT",
+ "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/browserify-sign/node_modules/readable-stream/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,
+ "license": "MIT"
+ },
+ "node_modules/browserify-sign/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,
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "node_modules/browserify-sign/node_modules/string_decoder/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,
+ "license": "MIT"
+ },
+ "node_modules/browserify-zlib": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
+ "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "pako": "~1.0.5"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.24.0",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "caniuse-lite": "^1.0.30001663",
+ "electron-to-chromium": "^1.5.28",
+ "node-releases": "^2.0.18",
+ "update-browserslist-db": "^1.1.0"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/bser": {
+ "version": "2.1.1",
+ "license": "Apache-2.0",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "node-int64": "^0.4.0"
+ }
+ },
+ "node_modules/buffer": {
+ "version": "5.7.1",
+ "devOptional": 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"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
+ },
+ "node_modules/buffer-crc32": {
+ "version": "0.2.13",
+ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
+ "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/buffer-from": {
+ "version": "1.1.2",
+ "devOptional": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/buffer-xor": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
+ "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/builtin-status-codes": {
+ "version": "3.0.0",
+ "license": "MIT"
+ },
+ "node_modules/bytes": {
+ "version": "3.1.2",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/cacheable-lookup": {
+ "version": "7.0.0",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.16"
+ }
+ },
+ "node_modules/cacheable-request": {
+ "version": "12.0.1",
+ "license": "MIT",
+ "dependencies": {
+ "@types/http-cache-semantics": "^4.0.4",
+ "get-stream": "^9.0.1",
+ "http-cache-semantics": "^4.1.1",
+ "keyv": "^4.5.4",
+ "mimic-response": "^4.0.0",
+ "normalize-url": "^8.0.1",
+ "responselike": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/cacheable-request/node_modules/get-stream": {
+ "version": "9.0.1",
+ "license": "MIT",
+ "dependencies": {
+ "@sec-ant/readable-stream": "^0.4.1",
+ "is-stream": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/cacheable-request/node_modules/is-stream": {
+ "version": "4.0.1",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/cachedir": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.4.0.tgz",
+ "integrity": "sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/call-bind": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz",
+ "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.0",
+ "es-define-property": "^1.0.0",
+ "get-intrinsic": "^1.2.4",
+ "set-function-length": "^1.2.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/call-bind-apply-helpers": {
+ "version": "1.0.2",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/call-bound": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
+ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "get-intrinsic": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/caller-callsite": {
+ "version": "2.0.0",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "callsites": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/caller-callsite/node_modules/callsites": {
+ "version": "2.0.0",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/caller-path": {
+ "version": "2.0.0",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "caller-callsite": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/camelcase": {
+ "version": "6.3.0",
+ "devOptional": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001668",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "CC-BY-4.0"
+ },
+ "node_modules/caseless": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+ "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/ccount": {
+ "version": "2.0.1",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "license": "MIT",
+ "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/chalk/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==",
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/chalk/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==",
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/chalk/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==",
+ "license": "MIT"
+ },
+ "node_modules/chalk/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==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/chalk/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==",
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/character-entities": {
+ "version": "2.0.2",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-entities-legacy": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz",
+ "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-reference-invalid": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz",
+ "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/check-more-types": {
+ "version": "2.24.0",
+ "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz",
+ "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/cheerio": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.1.0.tgz",
+ "integrity": "sha512-+0hMx9eYhJvWbgpKV9hN7jg0JcwydpopZE4hgi+KvQtByZXPp04NiCWU0LzcAbP63abZckIHkTQaXVF52mX3xQ==",
+ "license": "MIT",
+ "dependencies": {
+ "cheerio-select": "^2.1.0",
+ "dom-serializer": "^2.0.0",
+ "domhandler": "^5.0.3",
+ "domutils": "^3.2.2",
+ "encoding-sniffer": "^0.2.0",
+ "htmlparser2": "^10.0.0",
+ "parse5": "^7.3.0",
+ "parse5-htmlparser2-tree-adapter": "^7.1.0",
+ "parse5-parser-stream": "^7.1.2",
+ "undici": "^7.10.0",
+ "whatwg-mimetype": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=18.17"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/cheerio?sponsor=1"
+ }
+ },
+ "node_modules/cheerio-select": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz",
+ "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boolbase": "^1.0.0",
+ "css-select": "^5.1.0",
+ "css-what": "^6.1.0",
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3",
+ "domutils": "^3.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "3.6.0",
+ "dev": true,
+ "license": "MIT",
+ "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"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
},
- "node_modules/@types/ws": {
- "version": "8.18.1",
- "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz",
- "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==",
+ "node_modules/chrome-trace-event": {
+ "version": "1.0.3",
"dev": true,
"license": "MIT",
- "dependencies": {
- "@types/node": "*"
+ "peer": true,
+ "engines": {
+ "node": ">=6.0"
}
},
- "node_modules/@types/yargs": {
- "version": "17.0.32",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz",
- "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==",
- "dependencies": {
- "@types/yargs-parser": "*"
+ "node_modules/ci-info": {
+ "version": "3.9.0",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/@types/yargs-parser": {
- "version": "21.0.3",
- "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz",
- "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ=="
- },
- "node_modules/@vitejs/plugin-react-swc": {
- "version": "3.8.0",
- "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.8.0.tgz",
- "integrity": "sha512-T4sHPvS+DIqDP51ifPqa9XIRAz/kIvIi8oXcnOZZgHmMotgmmdxe/DD5tMFlt5nuIRzT0/QuiwmKlH0503Aapw==",
+ "node_modules/cipher-base": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.6.tgz",
+ "integrity": "sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "@swc/core": "^1.10.15"
+ "inherits": "^2.0.4",
+ "safe-buffer": "^5.2.1"
},
- "peerDependencies": {
- "vite": "^4 || ^5 || ^6"
+ "engines": {
+ "node": ">= 0.10"
}
},
- "node_modules/@vscode/codicons": {
- "version": "0.0.32",
- "resolved": "https://registry.npmjs.org/@vscode/codicons/-/codicons-0.0.32.tgz",
- "integrity": "sha512-3lgSTWhAzzWN/EPURoY4ZDBEA80OPmnaknNujA3qnI4Iu7AONWd9xF3iE4L+4prIe8E3TUnLQ4pxoaFTEEZNwg=="
- },
- "node_modules/@webassemblyjs/ast": {
- "version": "1.12.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz",
- "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==",
+ "node_modules/clean-stack": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
+ "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
"dev": true,
"license": "MIT",
- "peer": true,
- "dependencies": {
- "@webassemblyjs/helper-numbers": "1.11.6",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.6"
+ "engines": {
+ "node": ">=6"
}
},
- "node_modules/@webassemblyjs/floating-point-hex-parser": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz",
- "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==",
- "dev": true,
+ "node_modules/cli-cursor": {
+ "version": "3.1.0",
+ "devOptional": true,
"license": "MIT",
- "peer": true
+ "dependencies": {
+ "restore-cursor": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
},
- "node_modules/@webassemblyjs/helper-api-error": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz",
- "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==",
- "dev": true,
+ "node_modules/cli-spinners": {
+ "version": "2.9.2",
"license": "MIT",
- "peer": true
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
},
- "node_modules/@webassemblyjs/helper-buffer": {
- "version": "1.12.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz",
- "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==",
+ "node_modules/cli-table3": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz",
+ "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==",
"dev": true,
"license": "MIT",
- "peer": true
+ "dependencies": {
+ "string-width": "^4.2.0"
+ },
+ "engines": {
+ "node": "10.* || >= 12.*"
+ },
+ "optionalDependencies": {
+ "@colors/colors": "1.5.0"
+ }
},
- "node_modules/@webassemblyjs/helper-numbers": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz",
- "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==",
+ "node_modules/cli-truncate": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz",
+ "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
- "@webassemblyjs/floating-point-hex-parser": "1.11.6",
- "@webassemblyjs/helper-api-error": "1.11.6",
- "@xtuc/long": "4.2.2"
+ "slice-ansi": "^3.0.0",
+ "string-width": "^4.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/@webassemblyjs/helper-wasm-bytecode": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz",
- "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==",
+ "node_modules/cli-truncate/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,
"license": "MIT",
- "peer": true
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
},
- "node_modules/@webassemblyjs/helper-wasm-section": {
- "version": "1.12.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz",
- "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==",
+ "node_modules/cli-truncate/node_modules/astral-regex": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
"dev": true,
"license": "MIT",
- "peer": true,
- "dependencies": {
- "@webassemblyjs/ast": "1.12.1",
- "@webassemblyjs/helper-buffer": "1.12.1",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
- "@webassemblyjs/wasm-gen": "1.12.1"
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/@webassemblyjs/ieee754": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz",
- "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==",
+ "node_modules/cli-truncate/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,
"license": "MIT",
- "peer": true,
"dependencies": {
- "@xtuc/ieee754": "^1.2.0"
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
}
},
- "node_modules/@webassemblyjs/leb128": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz",
- "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==",
+ "node_modules/cli-truncate/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,
- "license": "Apache-2.0",
- "peer": true,
- "dependencies": {
- "@xtuc/long": "4.2.2"
- }
+ "license": "MIT"
},
- "node_modules/@webassemblyjs/utf8": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz",
- "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==",
+ "node_modules/cli-truncate/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,
"license": "MIT",
- "peer": true
+ "engines": {
+ "node": ">=8"
+ }
},
- "node_modules/@webassemblyjs/wasm-edit": {
- "version": "1.12.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz",
- "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==",
+ "node_modules/cli-truncate/node_modules/slice-ansi": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz",
+ "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
- "@webassemblyjs/ast": "1.12.1",
- "@webassemblyjs/helper-buffer": "1.12.1",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
- "@webassemblyjs/helper-wasm-section": "1.12.1",
- "@webassemblyjs/wasm-gen": "1.12.1",
- "@webassemblyjs/wasm-opt": "1.12.1",
- "@webassemblyjs/wasm-parser": "1.12.1",
- "@webassemblyjs/wast-printer": "1.12.1"
+ "ansi-styles": "^4.0.0",
+ "astral-regex": "^2.0.0",
+ "is-fullwidth-code-point": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/@webassemblyjs/wasm-gen": {
- "version": "1.12.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz",
- "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==",
- "dev": true,
- "license": "MIT",
- "peer": true,
+ "node_modules/cliui": {
+ "version": "8.0.1",
+ "license": "ISC",
"dependencies": {
- "@webassemblyjs/ast": "1.12.1",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
- "@webassemblyjs/ieee754": "1.11.6",
- "@webassemblyjs/leb128": "1.11.6",
- "@webassemblyjs/utf8": "1.11.6"
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.1",
+ "wrap-ansi": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
}
},
- "node_modules/@webassemblyjs/wasm-opt": {
- "version": "1.12.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz",
- "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==",
- "dev": true,
+ "node_modules/cliui/node_modules/strip-ansi": {
+ "version": "6.0.1",
"license": "MIT",
- "peer": true,
"dependencies": {
- "@webassemblyjs/ast": "1.12.1",
- "@webassemblyjs/helper-buffer": "1.12.1",
- "@webassemblyjs/wasm-gen": "1.12.1",
- "@webassemblyjs/wasm-parser": "1.12.1"
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/@webassemblyjs/wasm-parser": {
- "version": "1.12.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz",
- "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==",
- "dev": true,
+ "node_modules/clone": {
+ "version": "1.0.4",
"license": "MIT",
+ "optional": true,
"peer": true,
- "dependencies": {
- "@webassemblyjs/ast": "1.12.1",
- "@webassemblyjs/helper-api-error": "1.11.6",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
- "@webassemblyjs/ieee754": "1.11.6",
- "@webassemblyjs/leb128": "1.11.6",
- "@webassemblyjs/utf8": "1.11.6"
+ "engines": {
+ "node": ">=0.8"
}
},
- "node_modules/@webassemblyjs/wast-printer": {
- "version": "1.12.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz",
- "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==",
- "dev": true,
+ "node_modules/clone-deep": {
+ "version": "4.0.1",
+ "devOptional": true,
"license": "MIT",
- "peer": true,
"dependencies": {
- "@webassemblyjs/ast": "1.12.1",
- "@xtuc/long": "4.2.2"
+ "is-plain-object": "^2.0.4",
+ "kind-of": "^6.0.2",
+ "shallow-clone": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
}
},
- "node_modules/@xtuc/ieee754": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
- "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
- "dev": true,
- "license": "BSD-3-Clause",
- "peer": true
- },
- "node_modules/@xtuc/long": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
- "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
+ "node_modules/clone-stats": {
+ "version": "1.0.0",
"dev": true,
- "license": "Apache-2.0",
- "peer": true
- },
- "node_modules/abbrev": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
- "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
- "dev": true
+ "license": "MIT"
},
- "node_modules/abort-controller": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
- "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
- "dependencies": {
- "event-target-shim": "^5.0.0"
- },
+ "node_modules/clsx": {
+ "version": "2.1.0",
+ "license": "MIT",
"engines": {
- "node": ">=6.5"
+ "node": ">=6"
}
},
- "node_modules/accepts": {
- "version": "1.3.8",
- "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
- "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
+ "node_modules/color-convert": {
+ "version": "1.9.3",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
- "mime-types": "~2.1.34",
- "negotiator": "0.6.3"
- },
- "engines": {
- "node": ">= 0.6"
+ "color-name": "1.1.3"
}
},
- "node_modules/acorn": {
- "version": "8.11.3",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
- "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==",
- "bin": {
- "acorn": "bin/acorn"
- },
- "engines": {
- "node": ">=0.4.0"
- }
+ "node_modules/color-name": {
+ "version": "1.1.3",
+ "license": "MIT",
+ "optional": true,
+ "peer": true
},
- "node_modules/acorn-class-fields": {
- "version": "0.3.7",
- "resolved": "https://registry.npmjs.org/acorn-class-fields/-/acorn-class-fields-0.3.7.tgz",
- "integrity": "sha512-jdUWSFce0fuADUljmExz4TWpPkxmRW/ZCPRqeeUzbGf0vFUcpQYbyq52l75qGd0oSwwtAepeL6hgb/naRgvcKQ==",
- "dev": true,
+ "node_modules/colorette": {
+ "version": "1.4.0",
+ "license": "MIT",
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "license": "MIT",
"dependencies": {
- "acorn-private-class-elements": "^0.2.7"
+ "delayed-stream": "~1.0.0"
},
"engines": {
- "node": ">=4.8.2"
- },
- "peerDependencies": {
- "acorn": "^6 || ^7 || ^8"
+ "node": ">= 0.8"
}
},
- "node_modules/acorn-import-attributes": {
- "version": "1.9.5",
- "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz",
- "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==",
- "dev": true,
+ "node_modules/comma-separated-tokens": {
+ "version": "2.0.3",
"license": "MIT",
- "peer": true,
- "peerDependencies": {
- "acorn": "^8"
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
}
},
- "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/command-exists": {
+ "version": "1.2.9",
+ "license": "MIT",
+ "optional": true,
+ "peer": true
},
- "node_modules/acorn-private-class-elements": {
- "version": "0.2.7",
- "resolved": "https://registry.npmjs.org/acorn-private-class-elements/-/acorn-private-class-elements-0.2.7.tgz",
- "integrity": "sha512-+GZH2wOKNZOBI4OOPmzpo4cs6mW297sn6fgIk1dUI08jGjhAaEwvC39mN2gJAg2lmAQJ1rBkFqKWonL3Zz6PVA==",
- "dev": true,
+ "node_modules/commander": {
+ "version": "9.5.0",
+ "devOptional": true,
+ "license": "MIT",
"engines": {
- "node": ">=4.8.2"
- },
- "peerDependencies": {
- "acorn": "^6.1.0 || ^7 || ^8"
+ "node": "^12.20.0 || >=14"
}
},
- "node_modules/acorn-private-methods": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/acorn-private-methods/-/acorn-private-methods-0.3.3.tgz",
- "integrity": "sha512-46oeEol3YFvLSah5m9hGMlNpxDBCEkdceJgf01AjqKYTK9r6HexKs2rgSbLK81pYjZZMonhftuUReGMlbbv05w==",
+ "node_modules/common-path-prefix": {
+ "version": "3.0.0",
"dev": true,
- "dependencies": {
- "acorn-private-class-elements": "^0.2.7"
- },
+ "license": "ISC"
+ },
+ "node_modules/common-tags": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz",
+ "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==",
+ "dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=4.8.2"
- },
- "peerDependencies": {
- "acorn": "^6 || ^7 || ^8"
+ "node": ">=4.0.0"
}
},
- "node_modules/acorn-stage3": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/acorn-stage3/-/acorn-stage3-4.0.0.tgz",
- "integrity": "sha512-BR+LaADtA6GTB5prkNqWmlmCLYmkyW0whvSxdHhbupTaro2qBJ95fJDEiRLPUmiACGHPaYyeH9xmNJWdGfXRQw==",
- "dev": true,
+ "node_modules/commondir": {
+ "version": "1.0.1",
+ "license": "MIT",
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/compressible": {
+ "version": "2.0.18",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
- "acorn-class-fields": "^0.3.7",
- "acorn-private-methods": "^0.3.3",
- "acorn-static-class-features": "^0.2.4"
+ "mime-db": ">= 1.43.0 < 2"
},
"engines": {
- "node": ">=4.8.2"
- },
- "peerDependencies": {
- "acorn": "^7.4 || ^8"
+ "node": ">= 0.6"
}
},
- "node_modules/acorn-static-class-features": {
- "version": "0.2.4",
- "resolved": "https://registry.npmjs.org/acorn-static-class-features/-/acorn-static-class-features-0.2.4.tgz",
- "integrity": "sha512-5X4mpYq5J3pdndLmIB0+WtFd/mKWnNYpuTlTzj32wUu/PMmEGOiayQ5UrqgwdBNiaZBtDDh5kddpP7Yg2QaQYA==",
- "dev": true,
+ "node_modules/compression": {
+ "version": "1.7.4",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
- "acorn-private-class-elements": "^0.2.7"
+ "accepts": "~1.3.5",
+ "bytes": "3.0.0",
+ "compressible": "~2.0.16",
+ "debug": "2.6.9",
+ "on-headers": "~1.0.2",
+ "safe-buffer": "5.1.2",
+ "vary": "~1.1.2"
},
"engines": {
- "node": ">=4.8.2"
- },
- "peerDependencies": {
- "acorn": "^6.1.0 || ^7 || ^8"
+ "node": ">= 0.8.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,
+ "node_modules/compression/node_modules/bytes": {
+ "version": "3.0.0",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"engines": {
- "node": ">=0.4.0"
+ "node": ">= 0.8"
}
},
- "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,
+ "node_modules/compression/node_modules/debug": {
+ "version": "2.6.9",
+ "license": "MIT",
+ "optional": true,
+ "peer": 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/ajv-keywords": {
- "version": "3.5.2",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
- "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
- "dev": true,
- "peerDependencies": {
- "ajv": "^6.9.1"
+ "ms": "2.0.0"
}
},
- "node_modules/anser": {
- "version": "1.4.10",
- "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz",
- "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww=="
+ "node_modules/compression/node_modules/ms": {
+ "version": "2.0.0",
+ "license": "MIT",
+ "optional": true,
+ "peer": true
},
- "node_modules/ansi-fragments": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/ansi-fragments/-/ansi-fragments-0.2.1.tgz",
- "integrity": "sha512-DykbNHxuXQwUDRv5ibc2b0x7uw7wmwOGLBUd5RmaQ5z8Lhx19vwvKV+FAsM5rEA6dEcHxX+/Ad5s9eF2k2bB+w==",
+ "node_modules/compression/node_modules/safe-buffer": {
+ "version": "5.1.2",
"license": "MIT",
- "dependencies": {
- "colorette": "^1.0.7",
- "slice-ansi": "^2.0.0",
- "strip-ansi": "^5.0.0"
- }
+ "optional": true,
+ "peer": true
},
- "node_modules/ansi-html-community": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz",
- "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==",
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "license": "MIT"
+ },
+ "node_modules/concurrently": {
+ "version": "7.6.0",
"dev": true,
- "engines": [
- "node >= 0.8.0"
- ],
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^4.1.0",
+ "date-fns": "^2.29.1",
+ "lodash": "^4.17.21",
+ "rxjs": "^7.0.0",
+ "shell-quote": "^1.7.3",
+ "spawn-command": "^0.0.2-1",
+ "supports-color": "^8.1.0",
+ "tree-kill": "^1.2.2",
+ "yargs": "^17.3.1"
+ },
"bin": {
- "ansi-html": "bin/ansi-html"
+ "conc": "dist/bin/concurrently.js",
+ "concurrently": "dist/bin/concurrently.js"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/open-cli-tools/concurrently?sponsor=1"
}
},
- "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==",
+ "node_modules/concurrently/node_modules/has-flag": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
"engines": {
"node": ">=8"
}
},
- "node_modules/ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "node_modules/concurrently/node_modules/supports-color": {
+ "version": "8.1.1",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "color-convert": "^1.9.0"
+ "has-flag": "^4.0.0"
},
"engines": {
- "node": ">=4"
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?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==",
+ },
+ "node_modules/connect": {
+ "version": "3.7.0",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
- "normalize-path": "^3.0.0",
- "picomatch": "^2.0.4"
+ "debug": "2.6.9",
+ "finalhandler": "1.1.2",
+ "parseurl": "~1.3.3",
+ "utils-merge": "1.0.1"
},
"engines": {
- "node": ">= 8"
+ "node": ">= 0.10.0"
}
},
- "node_modules/appdirsjs": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/appdirsjs/-/appdirsjs-1.2.7.tgz",
- "integrity": "sha512-Quji6+8kLBC3NnBeo14nPDq0+2jUs5s3/xEye+udFHumHhRk4M7aAMXp/PBJqkKYGuuyR9M/6Dq7d2AViiGmhw==",
- "license": "MIT"
- },
- "node_modules/argparse": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
- "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "node_modules/connect/node_modules/debug": {
+ "version": "2.6.9",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
- "sprintf-js": "~1.0.2"
+ "ms": "2.0.0"
}
},
- "node_modules/aria-query": {
- "version": "5.1.3",
- "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz",
- "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==",
- "dev": true,
- "dependencies": {
- "deep-equal": "^2.0.5"
+ "node_modules/connect/node_modules/encodeurl": {
+ "version": "1.0.2",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">= 0.8"
}
},
- "node_modules/array-buffer-byte-length": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz",
- "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==",
- "dev": true,
+ "node_modules/connect/node_modules/finalhandler": {
+ "version": "1.1.2",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
- "call-bind": "^1.0.5",
- "is-array-buffer": "^3.0.4"
+ "debug": "2.6.9",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "on-finished": "~2.3.0",
+ "parseurl": "~1.3.3",
+ "statuses": "~1.5.0",
+ "unpipe": "~1.0.0"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">= 0.8"
}
},
- "node_modules/array-flatten": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
- "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
- },
- "node_modules/asap": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
- "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA=="
+ "node_modules/connect/node_modules/ms": {
+ "version": "2.0.0",
+ "license": "MIT",
+ "optional": true,
+ "peer": true
},
- "node_modules/ast-types": {
- "version": "0.15.2",
- "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.15.2.tgz",
- "integrity": "sha512-c27loCv9QkZinsa5ProX751khO9DJl/AcB5c2KNtA6NRvHKS0PgLfcftz72KVq504vB0Gku5s2kUZzDBvQWvHg==",
+ "node_modules/connect/node_modules/on-finished": {
+ "version": "2.3.0",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
- "tslib": "^2.0.1"
+ "ee-first": "1.1.1"
},
"engines": {
- "node": ">=4"
+ "node": ">= 0.8"
}
},
- "node_modules/astral-regex": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz",
- "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==",
+ "node_modules/connect/node_modules/statuses": {
+ "version": "1.5.0",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"engines": {
- "node": ">=4"
+ "node": ">= 0.6"
}
},
- "node_modules/async": {
- "version": "3.2.6",
- "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz",
- "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==",
- "license": "MIT"
- },
- "node_modules/async-limiter": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz",
- "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ=="
- },
- "node_modules/asynckit": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+ "node_modules/console-browserify": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz",
+ "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==",
+ "dev": true
},
- "node_modules/available-typed-arrays": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.6.tgz",
- "integrity": "sha512-j1QzY8iPNPG4o4xmO3ptzpRxTciqD3MgEHtifP/YnJpIo58Xu+ne4BejlbkuaLfXn/nz6HFiw29bLpj2PNMdGg==",
+ "node_modules/constants-browserify": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
+ "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==",
"dev": true,
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
+ "license": "MIT"
},
- "node_modules/axios": {
- "version": "1.8.4",
- "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.4.tgz",
- "integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==",
+ "node_modules/content-disposition": {
+ "version": "0.5.4",
"license": "MIT",
"dependencies": {
- "follow-redirects": "^1.15.6",
- "form-data": "^4.0.0",
- "proxy-from-env": "^1.1.0"
- }
- },
- "node_modules/babel-core": {
- "version": "7.0.0-bridge.0",
- "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz",
- "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==",
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/babel-plugin-macros": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz",
- "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==",
- "dependencies": {
- "@babel/runtime": "^7.12.5",
- "cosmiconfig": "^7.0.0",
- "resolve": "^1.19.0"
+ "safe-buffer": "5.2.1"
},
"engines": {
- "node": ">=10",
- "npm": ">=6"
+ "node": ">= 0.6"
}
},
- "node_modules/babel-plugin-polyfill-corejs2": {
- "version": "0.4.11",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz",
- "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==",
+ "node_modules/content-type": {
+ "version": "1.0.5",
"license": "MIT",
- "dependencies": {
- "@babel/compat-data": "^7.22.6",
- "@babel/helper-define-polyfill-provider": "^0.6.2",
- "semver": "^6.3.1"
- },
- "peerDependencies": {
- "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ "engines": {
+ "node": ">= 0.6"
}
},
- "node_modules/babel-plugin-polyfill-corejs2/node_modules/@babel/helper-define-polyfill-provider": {
- "version": "0.6.2",
- "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz",
- "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==",
+ "node_modules/convert-source-map": {
+ "version": "2.0.0",
+ "license": "MIT"
+ },
+ "node_modules/cookie": {
+ "version": "0.7.1",
"license": "MIT",
- "dependencies": {
- "@babel/helper-compilation-targets": "^7.22.6",
- "@babel/helper-plugin-utils": "^7.22.5",
- "debug": "^4.1.1",
- "lodash.debounce": "^4.0.8",
- "resolve": "^1.14.2"
- },
- "peerDependencies": {
- "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ "engines": {
+ "node": ">= 0.6"
}
},
- "node_modules/babel-plugin-polyfill-corejs3": {
- "version": "0.9.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.9.0.tgz",
- "integrity": "sha512-7nZPG1uzK2Ymhy/NbaOWTg3uibM2BmGASS4vHS4szRZAIR8R6GwA/xAujpdrXU5iyklrimWnLWU+BLF9suPTqg==",
+ "node_modules/cookie-signature": {
+ "version": "1.0.6",
+ "license": "MIT"
+ },
+ "node_modules/core-js-compat": {
+ "version": "3.38.1",
+ "license": "MIT",
+ "optional": true,
"peer": true,
"dependencies": {
- "@babel/helper-define-polyfill-provider": "^0.5.0",
- "core-js-compat": "^3.34.0"
+ "browserslist": "^4.23.3"
},
- "peerDependencies": {
- "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
}
},
- "node_modules/babel-plugin-polyfill-regenerator": {
- "version": "0.5.5",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz",
- "integrity": "sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==",
- "peer": true,
- "dependencies": {
- "@babel/helper-define-polyfill-provider": "^0.5.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ "node_modules/core-js-pure": {
+ "version": "3.35.1",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
}
},
- "node_modules/babel-plugin-syntax-trailing-function-commas": {
- "version": "7.0.0-beta.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz",
- "integrity": "sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==",
+ "node_modules/core-util-is": {
+ "version": "1.0.2",
"license": "MIT"
},
- "node_modules/babel-plugin-transform-flow-enums": {
- "version": "0.0.2",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-enums/-/babel-plugin-transform-flow-enums-0.0.2.tgz",
- "integrity": "sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==",
+ "node_modules/cosmiconfig": {
+ "version": "7.1.0",
"license": "MIT",
"dependencies": {
- "@babel/plugin-syntax-flow": "^7.12.1"
+ "@types/parse-json": "^4.0.0",
+ "import-fresh": "^3.2.1",
+ "parse-json": "^5.0.0",
+ "path-type": "^4.0.0",
+ "yaml": "^1.10.0"
+ },
+ "engines": {
+ "node": ">=10"
}
},
- "node_modules/babel-preset-fbjs": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/babel-preset-fbjs/-/babel-preset-fbjs-3.4.0.tgz",
- "integrity": "sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow==",
- "license": "MIT",
- "dependencies": {
- "@babel/plugin-proposal-class-properties": "^7.0.0",
- "@babel/plugin-proposal-object-rest-spread": "^7.0.0",
- "@babel/plugin-syntax-class-properties": "^7.0.0",
- "@babel/plugin-syntax-flow": "^7.0.0",
- "@babel/plugin-syntax-jsx": "^7.0.0",
- "@babel/plugin-syntax-object-rest-spread": "^7.0.0",
- "@babel/plugin-transform-arrow-functions": "^7.0.0",
- "@babel/plugin-transform-block-scoped-functions": "^7.0.0",
- "@babel/plugin-transform-block-scoping": "^7.0.0",
- "@babel/plugin-transform-classes": "^7.0.0",
- "@babel/plugin-transform-computed-properties": "^7.0.0",
- "@babel/plugin-transform-destructuring": "^7.0.0",
- "@babel/plugin-transform-flow-strip-types": "^7.0.0",
- "@babel/plugin-transform-for-of": "^7.0.0",
- "@babel/plugin-transform-function-name": "^7.0.0",
- "@babel/plugin-transform-literals": "^7.0.0",
- "@babel/plugin-transform-member-expression-literals": "^7.0.0",
- "@babel/plugin-transform-modules-commonjs": "^7.0.0",
- "@babel/plugin-transform-object-super": "^7.0.0",
- "@babel/plugin-transform-parameters": "^7.0.0",
- "@babel/plugin-transform-property-literals": "^7.0.0",
- "@babel/plugin-transform-react-display-name": "^7.0.0",
- "@babel/plugin-transform-react-jsx": "^7.0.0",
- "@babel/plugin-transform-shorthand-properties": "^7.0.0",
- "@babel/plugin-transform-spread": "^7.0.0",
- "@babel/plugin-transform-template-literals": "^7.0.0",
- "babel-plugin-syntax-trailing-function-commas": "^7.0.0-beta.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
+ "node_modules/cosmiconfig/node_modules/yaml": {
+ "version": "1.10.2",
+ "license": "ISC",
+ "engines": {
+ "node": ">= 6"
}
},
- "node_modules/bail": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz",
- "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
+ "node_modules/create-ecdh": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz",
+ "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "bn.js": "^4.1.0",
+ "elliptic": "^6.5.3"
}
},
- "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/bare-events": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.2.2.tgz",
- "integrity": "sha512-h7z00dWdG0PYOQEvChhOSWvOfkIKsdZGkWr083FgN/HyoQuebSew/cgirYqh9SCuy/hRvxc5Vy6Fw8xAmYHLkQ==",
+ "node_modules/create-ecdh/node_modules/bn.js": {
+ "version": "4.12.2",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz",
+ "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==",
"dev": true,
- "optional": true
+ "license": "MIT"
},
- "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/create-hash": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
+ "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cipher-base": "^1.0.1",
+ "inherits": "^2.0.1",
+ "md5.js": "^1.3.4",
+ "ripemd160": "^2.0.1",
+ "sha.js": "^2.4.0"
+ }
},
- "node_modules/before-after-hook": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-3.0.2.tgz",
- "integrity": "sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==",
- "license": "Apache-2.0"
+ "node_modules/create-hmac": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
+ "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cipher-base": "^1.0.3",
+ "create-hash": "^1.1.0",
+ "inherits": "^2.0.1",
+ "ripemd160": "^2.0.0",
+ "safe-buffer": "^5.0.1",
+ "sha.js": "^2.4.8"
+ }
},
- "node_modules/big.js": {
- "version": "5.2.2",
- "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
- "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
+ "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,
+ "license": "MIT"
+ },
+ "node_modules/cron-parser": {
+ "version": "4.9.0",
+ "license": "MIT",
+ "dependencies": {
+ "luxon": "^3.2.1"
+ },
"engines": {
- "node": "*"
+ "node": ">=12.0.0"
}
},
- "node_modules/binary-extensions": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
- "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+ "node_modules/cross-env": {
+ "version": "7.0.3",
+ "license": "MIT",
+ "dependencies": {
+ "cross-spawn": "^7.0.1"
+ },
+ "bin": {
+ "cross-env": "src/bin/cross-env.js",
+ "cross-env-shell": "src/bin/cross-env-shell.js"
+ },
"engines": {
- "node": ">=8"
+ "node": ">=10.14",
+ "npm": ">=6",
+ "yarn": ">=1"
}
},
- "node_modules/bl": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
- "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
+ "node_modules/cross-fetch": {
+ "version": "4.0.0",
"license": "MIT",
"dependencies": {
- "buffer": "^5.5.0",
- "inherits": "^2.0.4",
- "readable-stream": "^3.4.0"
+ "node-fetch": "^2.6.12"
}
},
- "node_modules/body-parser": {
- "version": "1.20.3",
- "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz",
- "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==",
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
"license": "MIT",
"dependencies": {
- "bytes": "3.1.2",
- "content-type": "~1.0.5",
- "debug": "2.6.9",
- "depd": "2.0.0",
- "destroy": "1.2.0",
- "http-errors": "2.0.0",
- "iconv-lite": "0.4.24",
- "on-finished": "2.4.1",
- "qs": "6.13.0",
- "raw-body": "2.5.2",
- "type-is": "~1.6.18",
- "unpipe": "1.0.0"
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
},
"engines": {
- "node": ">= 0.8",
- "npm": "1.2.8000 || >= 1.4.16"
+ "node": ">= 8"
}
},
- "node_modules/body-parser/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "node_modules/crypto-browserify": {
+ "version": "3.12.1",
+ "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.1.tgz",
+ "integrity": "sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "ms": "2.0.0"
+ "browserify-cipher": "^1.0.1",
+ "browserify-sign": "^4.2.3",
+ "create-ecdh": "^4.0.4",
+ "create-hash": "^1.2.0",
+ "create-hmac": "^1.1.7",
+ "diffie-hellman": "^5.0.3",
+ "hash-base": "~3.0.4",
+ "inherits": "^2.0.4",
+ "pbkdf2": "^3.1.2",
+ "public-encrypt": "^4.0.3",
+ "randombytes": "^2.1.0",
+ "randomfill": "^1.0.4"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/body-parser/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
- "license": "MIT"
+ "node_modules/css-loader": {
+ "version": "6.10.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "icss-utils": "^5.1.0",
+ "postcss": "^8.4.33",
+ "postcss-modules-extract-imports": "^3.0.0",
+ "postcss-modules-local-by-default": "^4.0.4",
+ "postcss-modules-scope": "^3.1.1",
+ "postcss-modules-values": "^4.0.0",
+ "postcss-value-parser": "^4.2.0",
+ "semver": "^7.5.4"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "@rspack/core": "0.x || 1.x",
+ "webpack": "^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@rspack/core": {
+ "optional": true
+ },
+ "webpack": {
+ "optional": true
+ }
+ }
},
- "node_modules/boolbase": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
- "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="
+ "node_modules/css-loader/node_modules/lru-cache": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
},
- "node_modules/bottleneck": {
- "version": "2.19.5",
- "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz",
- "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==",
- "license": "MIT"
+ "node_modules/css-loader/node_modules/semver": {
+ "version": "7.6.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
},
- "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==",
+ "node_modules/css-loader/node_modules/yallist": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/css-select": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz",
+ "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==",
+ "license": "BSD-2-Clause",
"dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
+ "boolbase": "^1.0.0",
+ "css-what": "^6.1.0",
+ "domhandler": "^5.0.2",
+ "domutils": "^3.0.1",
+ "nth-check": "^2.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
}
},
- "node_modules/braces": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
- "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "node_modules/css-what": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz",
+ "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">= 6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/cssesc": {
+ "version": "3.0.0",
+ "dev": true,
"license": "MIT",
- "dependencies": {
- "fill-range": "^7.1.1"
+ "bin": {
+ "cssesc": "bin/cssesc"
},
"engines": {
- "node": ">=8"
+ "node": ">=4"
}
},
- "node_modules/browserslist": {
- "version": "4.24.0",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz",
- "integrity": "sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==",
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/browserslist"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
+ "node_modules/csstype": {
+ "version": "3.1.3",
+ "license": "MIT"
+ },
+ "node_modules/cypress": {
+ "version": "13.17.0",
+ "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.17.0.tgz",
+ "integrity": "sha512-5xWkaPurwkIljojFidhw8lFScyxhtiFHl/i/3zov+1Z5CmY4t9tjIdvSXfu82Y3w7wt0uR9KkucbhkVvJZLQSA==",
+ "dev": true,
+ "hasInstallScript": true,
"license": "MIT",
"dependencies": {
- "caniuse-lite": "^1.0.30001663",
- "electron-to-chromium": "^1.5.28",
- "node-releases": "^2.0.18",
- "update-browserslist-db": "^1.1.0"
+ "@cypress/request": "^3.0.6",
+ "@cypress/xvfb": "^1.2.4",
+ "@types/sinonjs__fake-timers": "8.1.1",
+ "@types/sizzle": "^2.3.2",
+ "arch": "^2.2.0",
+ "blob-util": "^2.0.2",
+ "bluebird": "^3.7.2",
+ "buffer": "^5.7.1",
+ "cachedir": "^2.3.0",
+ "chalk": "^4.1.0",
+ "check-more-types": "^2.24.0",
+ "ci-info": "^4.0.0",
+ "cli-cursor": "^3.1.0",
+ "cli-table3": "~0.6.1",
+ "commander": "^6.2.1",
+ "common-tags": "^1.8.0",
+ "dayjs": "^1.10.4",
+ "debug": "^4.3.4",
+ "enquirer": "^2.3.6",
+ "eventemitter2": "6.4.7",
+ "execa": "4.1.0",
+ "executable": "^4.1.1",
+ "extract-zip": "2.0.1",
+ "figures": "^3.2.0",
+ "fs-extra": "^9.1.0",
+ "getos": "^3.2.1",
+ "is-installed-globally": "~0.4.0",
+ "lazy-ass": "^1.6.0",
+ "listr2": "^3.8.3",
+ "lodash": "^4.17.21",
+ "log-symbols": "^4.0.0",
+ "minimist": "^1.2.8",
+ "ospath": "^1.2.2",
+ "pretty-bytes": "^5.6.0",
+ "process": "^0.11.10",
+ "proxy-from-env": "1.0.0",
+ "request-progress": "^3.0.0",
+ "semver": "^7.5.3",
+ "supports-color": "^8.1.1",
+ "tmp": "~0.2.3",
+ "tree-kill": "1.2.2",
+ "untildify": "^4.0.0",
+ "yauzl": "^2.10.0"
},
"bin": {
- "browserslist": "cli.js"
+ "cypress": "bin/cypress"
},
"engines": {
- "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ "node": "^16.0.0 || ^18.0.0 || >=20.0.0"
}
},
- "node_modules/bser": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz",
- "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==",
- "license": "Apache-2.0",
- "dependencies": {
- "node-int64": "^0.4.0"
+ "node_modules/cypress-iframe": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/cypress-iframe/-/cypress-iframe-1.0.1.tgz",
+ "integrity": "sha512-Ne+xkZmWMhfq3x6wbfzK/SzsVTCrJru3R3cLXsoSAZyfUtJDamXyaIieHXeea3pQDXF4wE2w4iUuvCYHhoD31g==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/cypress": "^1.1.0"
}
},
- "node_modules/buffer": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
- "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+ "node_modules/cypress/node_modules/ci-info": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.2.0.tgz",
+ "integrity": "sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg==",
+ "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"
+ "url": "https://github.com/sponsors/sibiraj-s"
}
],
"license": "MIT",
- "dependencies": {
- "base64-js": "^1.3.1",
- "ieee754": "^1.1.13"
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/buffer-from": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
- "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
- },
- "node_modules/builtin-status-codes": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
- "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ=="
- },
- "node_modules/bytes": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
- "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+ "node_modules/cypress/node_modules/commander": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz",
+ "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==",
+ "dev": true,
"license": "MIT",
"engines": {
- "node": ">= 0.8"
+ "node": ">= 6"
}
},
- "node_modules/cacheable-lookup": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz",
- "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==",
+ "node_modules/cypress/node_modules/execa": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz",
+ "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==",
+ "dev": true,
"license": "MIT",
+ "dependencies": {
+ "cross-spawn": "^7.0.0",
+ "get-stream": "^5.0.0",
+ "human-signals": "^1.1.1",
+ "is-stream": "^2.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^4.0.0",
+ "onetime": "^5.1.0",
+ "signal-exit": "^3.0.2",
+ "strip-final-newline": "^2.0.0"
+ },
"engines": {
- "node": ">=14.16"
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
}
},
- "node_modules/cacheable-request": {
- "version": "12.0.1",
- "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-12.0.1.tgz",
- "integrity": "sha512-Yo9wGIQUaAfIbk+qY0X4cDQgCosecfBe3V9NSyeY4qPC2SAkbCS4Xj79VP8WOzitpJUZKc/wsRCYF5ariDIwkg==",
+ "node_modules/cypress/node_modules/fs-extra": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+ "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "@types/http-cache-semantics": "^4.0.4",
- "get-stream": "^9.0.1",
- "http-cache-semantics": "^4.1.1",
- "keyv": "^4.5.4",
- "mimic-response": "^4.0.0",
- "normalize-url": "^8.0.1",
- "responselike": "^3.0.0"
+ "at-least-node": "^1.0.0",
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
},
"engines": {
- "node": ">=18"
+ "node": ">=10"
}
},
- "node_modules/cacheable-request/node_modules/get-stream": {
- "version": "9.0.1",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz",
- "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==",
+ "node_modules/cypress/node_modules/get-stream": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
+ "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "@sec-ant/readable-stream": "^0.4.1",
- "is-stream": "^4.0.1"
+ "pump": "^3.0.0"
},
"engines": {
- "node": ">=18"
+ "node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/cacheable-request/node_modules/is-stream": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz",
- "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==",
+ "node_modules/cypress/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,
"license": "MIT",
"engines": {
- "node": ">=18"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">=8"
}
},
- "node_modules/call-bind": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
- "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
- "license": "MIT",
- "dependencies": {
- "es-define-property": "^1.0.0",
- "es-errors": "^1.3.0",
- "function-bind": "^1.1.2",
- "get-intrinsic": "^1.2.4",
- "set-function-length": "^1.2.1"
- },
+ "node_modules/cypress/node_modules/human-signals": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
+ "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==",
+ "dev": true,
+ "license": "Apache-2.0",
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">=8.12.0"
}
},
- "node_modules/call-bind-apply-helpers": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
- "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+ "node_modules/cypress/node_modules/jsonfile": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "es-errors": "^1.3.0",
- "function-bind": "^1.1.2"
+ "universalify": "^2.0.0"
+ },
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/cypress/node_modules/semver": {
+ "version": "7.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
+ "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
},
"engines": {
- "node": ">= 0.4"
+ "node": ">=10"
}
},
- "node_modules/caller-callsite": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz",
- "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==",
+ "node_modules/cypress/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,
"license": "MIT",
"dependencies": {
- "callsites": "^2.0.0"
+ "has-flag": "^4.0.0"
},
"engines": {
- "node": ">=4"
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
}
},
- "node_modules/caller-callsite/node_modules/callsites": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz",
- "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==",
+ "node_modules/cypress/node_modules/universalify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+ "dev": true,
"license": "MIT",
"engines": {
- "node": ">=4"
+ "node": ">= 10.0.0"
}
},
- "node_modules/caller-path": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz",
- "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==",
+ "node_modules/cytoscape": {
+ "version": "3.28.1",
"license": "MIT",
"dependencies": {
- "caller-callsite": "^2.0.0"
+ "heap": "^0.2.6",
+ "lodash": "^4.17.21"
},
"engines": {
- "node": ">=4"
- }
- },
- "node_modules/callsites": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
- "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
- "engines": {
- "node": ">=6"
+ "node": ">=0.10"
}
},
- "node_modules/camelcase": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
- "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
- "engines": {
- "node": ">=10"
+ "node_modules/cytoscape-elk": {
+ "version": "2.2.0",
+ "license": "MIT",
+ "dependencies": {
+ "elkjs": "^0.8.1"
},
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/caniuse-lite": {
- "version": "1.0.30001668",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001668.tgz",
- "integrity": "sha512-nWLrdxqCdblixUO+27JtGJJE/txpJlyUy5YN1u53wLZkP0emYCo5zgS6QYft7VUYR42LGgi/S5hdLZTrnyIddw==",
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "CC-BY-4.0"
- },
- "node_modules/ccount": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz",
- "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
+ "peerDependencies": {
+ "cytoscape": "^3.2.0"
}
},
- "node_modules/character-entities": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz",
- "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
+ "node_modules/cytoscape-klay": {
+ "version": "3.1.4",
+ "license": "MIT",
+ "dependencies": {
+ "klayjs": "^0.4.1"
+ },
+ "peerDependencies": {
+ "cytoscape": "^3.2.0"
}
},
- "node_modules/cheerio": {
- "version": "1.0.0-rc.12",
- "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz",
- "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==",
+ "node_modules/dashdash": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+ "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==",
+ "license": "MIT",
"dependencies": {
- "cheerio-select": "^2.1.0",
- "dom-serializer": "^2.0.0",
- "domhandler": "^5.0.3",
- "domutils": "^3.0.1",
- "htmlparser2": "^8.0.1",
- "parse5": "^7.0.0",
- "parse5-htmlparser2-tree-adapter": "^7.0.0"
+ "assert-plus": "^1.0.0"
},
"engines": {
- "node": ">= 6"
- },
- "funding": {
- "url": "https://github.com/cheeriojs/cheerio?sponsor=1"
+ "node": ">=0.10"
}
},
- "node_modules/cheerio-select": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz",
- "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==",
+ "node_modules/date-fns": {
+ "version": "2.30.0",
+ "license": "MIT",
"dependencies": {
- "boolbase": "^1.0.0",
- "css-select": "^5.1.0",
- "css-what": "^6.1.0",
- "domelementtype": "^2.3.0",
- "domhandler": "^5.0.3",
- "domutils": "^3.0.1"
+ "@babel/runtime": "^7.21.0"
+ },
+ "engines": {
+ "node": ">=0.11"
},
"funding": {
- "url": "https://github.com/sponsors/fb55"
+ "type": "opencollective",
+ "url": "https://opencollective.com/date-fns"
}
},
- "node_modules/chokidar": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
- "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+ "node_modules/dayjs": {
+ "version": "1.11.13",
+ "devOptional": true,
+ "license": "MIT"
+ },
+ "node_modules/debounce": {
+ "version": "1.2.1",
+ "license": "MIT"
+ },
+ "node_modules/debug": {
+ "version": "4.3.4",
+ "license": "MIT",
"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"
+ "ms": "2.1.2"
},
"engines": {
- "node": ">= 8.10.0"
- },
- "funding": {
- "url": "https://paulmillr.com/funding/"
+ "node": ">=6.0"
},
- "optionalDependencies": {
- "fsevents": "~2.3.2"
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
}
},
- "node_modules/chrome-trace-event": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz",
- "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==",
- "dev": true,
+ "node_modules/decamelize": {
+ "version": "1.2.0",
+ "license": "MIT",
+ "optional": true,
"peer": true,
"engines": {
- "node": ">=6.0"
+ "node": ">=0.10.0"
}
},
- "node_modules/ci-info": {
- "version": "3.9.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
- "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/sibiraj-s"
- }
- ],
- "engines": {
- "node": ">=8"
+ "node_modules/decode-named-character-reference": {
+ "version": "1.0.2",
+ "license": "MIT",
+ "dependencies": {
+ "character-entities": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
}
},
- "node_modules/cli-cursor": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
- "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
+ "node_modules/decompress-response": {
+ "version": "6.0.0",
"license": "MIT",
"dependencies": {
- "restore-cursor": "^3.1.0"
+ "mimic-response": "^3.1.0"
},
"engines": {
- "node": ">=8"
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/cli-spinners": {
- "version": "2.9.2",
- "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz",
- "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==",
+ "node_modules/decompress-response/node_modules/mimic-response": {
+ "version": "3.1.0",
"license": "MIT",
"engines": {
- "node": ">=6"
+ "node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/cliui": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
- "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
+ "node_modules/deep-equal": {
+ "version": "2.2.3",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "string-width": "^4.2.0",
- "strip-ansi": "^6.0.1",
- "wrap-ansi": "^7.0.0"
+ "array-buffer-byte-length": "^1.0.0",
+ "call-bind": "^1.0.5",
+ "es-get-iterator": "^1.1.3",
+ "get-intrinsic": "^1.2.2",
+ "is-arguments": "^1.1.1",
+ "is-array-buffer": "^3.0.2",
+ "is-date-object": "^1.0.5",
+ "is-regex": "^1.1.4",
+ "is-shared-array-buffer": "^1.0.2",
+ "isarray": "^2.0.5",
+ "object-is": "^1.1.5",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.4",
+ "regexp.prototype.flags": "^1.5.1",
+ "side-channel": "^1.0.4",
+ "which-boxed-primitive": "^1.0.2",
+ "which-collection": "^1.0.1",
+ "which-typed-array": "^1.1.13"
},
"engines": {
- "node": ">=12"
- }
- },
- "node_modules/cliui/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==",
- "dependencies": {
- "ansi-regex": "^5.0.1"
+ "node": ">= 0.4"
},
- "engines": {
- "node": ">=8"
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/clone": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
- "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==",
+ "node_modules/deepmerge": {
+ "version": "4.3.1",
+ "devOptional": true,
"license": "MIT",
"engines": {
- "node": ">=0.8"
+ "node": ">=0.10.0"
}
},
- "node_modules/clone-deep": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
- "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==",
+ "node_modules/defaults": {
+ "version": "1.0.4",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
- "is-plain-object": "^2.0.4",
- "kind-of": "^6.0.2",
- "shallow-clone": "^3.0.0"
+ "clone": "^1.0.2"
},
- "engines": {
- "node": ">=6"
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/clone-stats": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz",
- "integrity": "sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag==",
- "dev": true
- },
- "node_modules/clsx": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz",
- "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==",
+ "node_modules/defer-to-connect": {
+ "version": "2.0.1",
+ "license": "MIT",
"engines": {
- "node": ">=6"
+ "node": ">=10"
}
},
- "node_modules/color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "node_modules/define-data-property": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
+ "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "color-name": "1.1.3"
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
- },
- "node_modules/colorette": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz",
- "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==",
- "license": "MIT"
- },
- "node_modules/combined-stream": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
- "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "node_modules/define-properties": {
+ "version": "1.2.1",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "delayed-stream": "~1.0.0"
+ "define-data-property": "^1.0.1",
+ "has-property-descriptors": "^1.0.0",
+ "object-keys": "^1.1.1"
},
"engines": {
- "node": ">= 0.8"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/comma-separated-tokens": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz",
- "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4.0"
}
},
- "node_modules/command-exists": {
- "version": "1.2.9",
- "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz",
- "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==",
- "license": "MIT"
+ "node_modules/denodeify": {
+ "version": "1.2.1",
+ "license": "MIT",
+ "optional": true,
+ "peer": true
},
- "node_modules/commander": {
- "version": "9.5.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz",
- "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==",
+ "node_modules/depd": {
+ "version": "2.0.0",
+ "license": "MIT",
"engines": {
- "node": "^12.20.0 || >=14"
+ "node": ">= 0.8"
}
},
- "node_modules/common-path-prefix": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz",
- "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==",
- "dev": true
+ "node_modules/deprecated-react-native-prop-types": {
+ "version": "4.2.3",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@react-native/normalize-colors": "<0.73.0",
+ "invariant": "^2.2.4",
+ "prop-types": "^15.8.1"
+ }
},
- "node_modules/commondir": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
- "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg=="
+ "node_modules/dequal": {
+ "version": "2.0.3",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
},
- "node_modules/compressible": {
- "version": "2.0.18",
- "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
- "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
+ "node_modules/des.js": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz",
+ "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "mime-db": ">= 1.43.0 < 2"
- },
+ "inherits": "^2.0.1",
+ "minimalistic-assert": "^1.0.0"
+ }
+ },
+ "node_modules/destroy": {
+ "version": "1.2.0",
+ "license": "MIT",
"engines": {
- "node": ">= 0.6"
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
}
},
- "node_modules/compression": {
- "version": "1.7.4",
- "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz",
- "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==",
+ "node_modules/devlop": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz",
+ "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==",
"license": "MIT",
"dependencies": {
- "accepts": "~1.3.5",
- "bytes": "3.0.0",
- "compressible": "~2.0.16",
- "debug": "2.6.9",
- "on-headers": "~1.0.2",
- "safe-buffer": "5.1.2",
- "vary": "~1.1.2"
+ "dequal": "^2.0.0"
},
- "engines": {
- "node": ">= 0.8.0"
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
}
},
- "node_modules/compression/node_modules/bytes": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
- "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==",
- "license": "MIT",
+ "node_modules/diff": {
+ "version": "5.1.0",
+ "license": "BSD-3-Clause",
"engines": {
- "node": ">= 0.8"
+ "node": ">=0.3.1"
}
},
- "node_modules/compression/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "node_modules/diffie-hellman": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
+ "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "ms": "2.0.0"
+ "bn.js": "^4.1.0",
+ "miller-rabin": "^4.0.0",
+ "randombytes": "^2.0.0"
}
},
- "node_modules/compression/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "node_modules/diffie-hellman/node_modules/bn.js": {
+ "version": "4.12.2",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz",
+ "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==",
+ "dev": true,
"license": "MIT"
},
- "node_modules/compression/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==",
+ "node_modules/dom-accessibility-api": {
+ "version": "0.5.16",
+ "dev": true,
"license": "MIT"
},
- "node_modules/concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
- },
- "node_modules/concurrently": {
- "version": "7.6.0",
- "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.6.0.tgz",
- "integrity": "sha512-BKtRgvcJGeZ4XttiDiNcFiRlxoAeZOseqUvyYRUp/Vtd+9p1ULmeoSqGsDA+2ivdeDFpqrJvGvmI+StKfKl5hw==",
- "dev": true,
+ "node_modules/dom-helpers": {
+ "version": "5.2.1",
+ "license": "MIT",
"dependencies": {
- "chalk": "^4.1.0",
- "date-fns": "^2.29.1",
- "lodash": "^4.17.21",
- "rxjs": "^7.0.0",
- "shell-quote": "^1.7.3",
- "spawn-command": "^0.0.2-1",
- "supports-color": "^8.1.0",
- "tree-kill": "^1.2.2",
- "yargs": "^17.3.1"
- },
- "bin": {
- "conc": "dist/bin/concurrently.js",
- "concurrently": "dist/bin/concurrently.js"
- },
- "engines": {
- "node": "^12.20.0 || ^14.13.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://github.com/open-cli-tools/concurrently?sponsor=1"
+ "@babel/runtime": "^7.8.7",
+ "csstype": "^3.0.2"
}
},
- "node_modules/concurrently/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,
+ "node_modules/dom-serializer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
+ "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
+ "license": "MIT",
"dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.2",
+ "entities": "^4.2.0"
},
"funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
}
},
- "node_modules/concurrently/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "node_modules/domain-browser": {
+ "version": "4.22.0",
+ "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-4.22.0.tgz",
+ "integrity": "sha512-IGBwjF7tNk3cwypFNH/7bfzBcgSCbaMOD3GsaY1AU/JRrnHnYgEM0+9kQt52iZxjNsjBtJYtao146V+f8jFZNw==",
"dev": true,
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
+ "license": "MIT",
"engines": {
"node": ">=10"
},
"funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
+ "url": "https://bevry.me/fund"
}
},
- "node_modules/concurrently/node_modules/chalk/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,
+ "node_modules/domelementtype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/domhandler": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
+ "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
+ "license": "BSD-2-Clause",
"dependencies": {
- "has-flag": "^4.0.0"
+ "domelementtype": "^2.3.0"
},
"engines": {
- "node": ">=8"
+ "node": ">= 4"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
}
},
- "node_modules/concurrently/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,
+ "node_modules/domutils": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz",
+ "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==",
+ "license": "BSD-2-Clause",
"dependencies": {
- "color-name": "~1.1.4"
+ "dom-serializer": "^2.0.0",
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3"
},
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/concurrently/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/concurrently/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"
+ "funding": {
+ "url": "https://github.com/fb55/domutils?sponsor=1"
}
},
- "node_modules/concurrently/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==",
+ "node_modules/dot-case": {
+ "version": "3.0.4",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/supports-color?sponsor=1"
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3"
}
},
- "node_modules/connect": {
- "version": "3.7.0",
- "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz",
- "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==",
+ "node_modules/dunder-proto": {
+ "version": "1.0.1",
"license": "MIT",
"dependencies": {
- "debug": "2.6.9",
- "finalhandler": "1.1.2",
- "parseurl": "~1.3.3",
- "utils-merge": "1.0.1"
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
},
"engines": {
- "node": ">= 0.10.0"
+ "node": ">= 0.4"
}
},
- "node_modules/connect/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "node_modules/ecc-jsbn": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
+ "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==",
"license": "MIT",
"dependencies": {
- "ms": "2.0.0"
+ "jsbn": "~0.1.0",
+ "safer-buffer": "^2.1.0"
}
},
- "node_modules/connect/node_modules/encodeurl": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
- "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.8"
- }
+ "node_modules/ee-first": {
+ "version": "1.1.1",
+ "license": "MIT"
},
- "node_modules/connect/node_modules/finalhandler": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
- "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
+ "node_modules/electron-to-chromium": {
+ "version": "1.5.36",
+ "license": "ISC"
+ },
+ "node_modules/elkjs": {
+ "version": "0.8.2",
+ "license": "EPL-2.0"
+ },
+ "node_modules/elliptic": {
+ "version": "6.6.1",
+ "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz",
+ "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "debug": "2.6.9",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "on-finished": "~2.3.0",
- "parseurl": "~1.3.3",
- "statuses": "~1.5.0",
- "unpipe": "~1.0.0"
- },
- "engines": {
- "node": ">= 0.8"
+ "bn.js": "^4.11.9",
+ "brorand": "^1.1.0",
+ "hash.js": "^1.0.0",
+ "hmac-drbg": "^1.0.1",
+ "inherits": "^2.0.4",
+ "minimalistic-assert": "^1.0.1",
+ "minimalistic-crypto-utils": "^1.0.1"
}
},
- "node_modules/connect/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "node_modules/elliptic/node_modules/bn.js": {
+ "version": "4.12.2",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz",
+ "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==",
+ "dev": true,
"license": "MIT"
},
- "node_modules/connect/node_modules/on-finished": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
- "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==",
+ "node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "license": "MIT"
+ },
+ "node_modules/emojis-list": {
+ "version": "3.0.0",
+ "dev": true,
"license": "MIT",
- "dependencies": {
- "ee-first": "1.1.1"
- },
"engines": {
- "node": ">= 0.8"
+ "node": ">= 4"
}
},
- "node_modules/connect/node_modules/statuses": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
- "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==",
+ "node_modules/encodeurl": {
+ "version": "2.0.0",
"license": "MIT",
"engines": {
- "node": ">= 0.6"
+ "node": ">= 0.8"
}
},
- "node_modules/content-disposition": {
- "version": "0.5.4",
- "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
- "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
+ "node_modules/encoding-sniffer": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz",
+ "integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==",
+ "license": "MIT",
"dependencies": {
- "safe-buffer": "5.2.1"
+ "iconv-lite": "^0.6.3",
+ "whatwg-encoding": "^3.1.1"
},
- "engines": {
- "node": ">= 0.6"
+ "funding": {
+ "url": "https://github.com/fb55/encoding-sniffer?sponsor=1"
}
},
- "node_modules/content-type": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
- "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
+ "node_modules/encoding-sniffer/node_modules/iconv-lite": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
"license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
"engines": {
- "node": ">= 0.6"
+ "node": ">=0.10.0"
}
},
- "node_modules/convert-source-map": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
- "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="
- },
- "node_modules/cookie": {
- "version": "0.7.1",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz",
- "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==",
+ "node_modules/end-of-stream": {
+ "version": "1.4.5",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz",
+ "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==",
+ "dev": true,
"license": "MIT",
- "engines": {
- "node": ">= 0.6"
+ "dependencies": {
+ "once": "^1.4.0"
}
},
- "node_modules/cookie-signature": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
- "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
- },
- "node_modules/core-js-compat": {
- "version": "3.38.1",
- "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.1.tgz",
- "integrity": "sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==",
+ "node_modules/enhanced-resolve": {
+ "version": "5.17.1",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "browserslist": "^4.23.3"
+ "graceful-fs": "^4.2.4",
+ "tapable": "^2.2.0"
},
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/core-js"
+ "engines": {
+ "node": ">=10.13.0"
}
},
- "node_modules/core-js-pure": {
- "version": "3.35.1",
- "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.35.1.tgz",
- "integrity": "sha512-zcIdi/CL3MWbBJYo5YCeVAAx+Sy9yJE9I3/u9LkFABwbeaPhTMRWraM8mYFp9jW5Z50hOy7FVzCc8dCrpZqtIQ==",
+ "node_modules/enquirer": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz",
+ "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==",
"dev": true,
- "hasInstallScript": true,
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/core-js"
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "^4.1.1",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8.6"
}
},
- "node_modules/core-util-is": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
- "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ=="
- },
- "node_modules/cosmiconfig": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
- "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==",
+ "node_modules/enquirer/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,
+ "license": "MIT",
"dependencies": {
- "@types/parse-json": "^4.0.0",
- "import-fresh": "^3.2.1",
- "parse-json": "^5.0.0",
- "path-type": "^4.0.0",
- "yaml": "^1.10.0"
+ "ansi-regex": "^5.0.1"
},
"engines": {
- "node": ">=10"
+ "node": ">=8"
}
},
- "node_modules/cosmiconfig/node_modules/yaml": {
- "version": "1.10.2",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
- "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
- "license": "ISC",
+ "node_modules/ensure-type": {
+ "version": "1.5.1",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/entities": {
+ "version": "4.5.0",
+ "license": "BSD-2-Clause",
"engines": {
- "node": ">= 6"
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
}
},
- "node_modules/cron-parser": {
- "version": "4.9.0",
- "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-4.9.0.tgz",
- "integrity": "sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==",
+ "node_modules/envinfo": {
+ "version": "7.14.0",
"license": "MIT",
- "dependencies": {
- "luxon": "^3.2.1"
+ "optional": true,
+ "peer": true,
+ "bin": {
+ "envinfo": "dist/cli.js"
},
"engines": {
- "node": ">=12.0.0"
+ "node": ">=4"
}
},
- "node_modules/cross-env": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz",
- "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==",
+ "node_modules/eol": {
+ "version": "0.9.1",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/error-ex": {
+ "version": "1.3.2",
+ "license": "MIT",
"dependencies": {
- "cross-spawn": "^7.0.1"
- },
- "bin": {
- "cross-env": "src/bin/cross-env.js",
- "cross-env-shell": "src/bin/cross-env-shell.js"
- },
- "engines": {
- "node": ">=10.14",
- "npm": ">=6",
- "yarn": ">=1"
+ "is-arrayish": "^0.2.1"
}
},
- "node_modules/cross-fetch": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz",
- "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==",
+ "node_modules/error-stack-parser": {
+ "version": "2.1.4",
+ "devOptional": true,
+ "license": "MIT",
"dependencies": {
- "node-fetch": "^2.6.12"
+ "stackframe": "^1.3.4"
}
},
- "node_modules/cross-spawn": {
- "version": "7.0.6",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
- "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "node_modules/errorhandler": {
+ "version": "1.5.1",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
- "path-key": "^3.1.0",
- "shebang-command": "^2.0.0",
- "which": "^2.0.1"
+ "accepts": "~1.3.7",
+ "escape-html": "~1.0.3"
},
"engines": {
- "node": ">= 8"
+ "node": ">= 0.8"
}
},
- "node_modules/css-loader": {
- "version": "6.10.0",
- "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.10.0.tgz",
- "integrity": "sha512-LTSA/jWbwdMlk+rhmElbDR2vbtQoTBPr7fkJE+mxrHj+7ru0hUmHafDRzWIjIHTwpitWVaqY2/UWGRca3yUgRw==",
- "dev": true,
- "dependencies": {
- "icss-utils": "^5.1.0",
- "postcss": "^8.4.33",
- "postcss-modules-extract-imports": "^3.0.0",
- "postcss-modules-local-by-default": "^4.0.4",
- "postcss-modules-scope": "^3.1.1",
- "postcss-modules-values": "^4.0.0",
- "postcss-value-parser": "^4.2.0",
- "semver": "^7.5.4"
- },
+ "node_modules/es-define-property": {
+ "version": "1.0.1",
+ "license": "MIT",
"engines": {
- "node": ">= 12.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "@rspack/core": "0.x || 1.x",
- "webpack": "^5.0.0"
- },
- "peerDependenciesMeta": {
- "@rspack/core": {
- "optional": true
- },
- "webpack": {
- "optional": true
- }
+ "node": ">= 0.4"
}
},
- "node_modules/css-loader/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"
- },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "license": "MIT",
"engines": {
- "node": ">=10"
+ "node": ">= 0.4"
}
},
- "node_modules/css-loader/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==",
+ "node_modules/es-get-iterator": {
+ "version": "1.1.3",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "lru-cache": "^6.0.0"
- },
- "bin": {
- "semver": "bin/semver.js"
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.1.3",
+ "has-symbols": "^1.0.3",
+ "is-arguments": "^1.1.1",
+ "is-map": "^2.0.2",
+ "is-set": "^2.0.2",
+ "is-string": "^1.0.7",
+ "isarray": "^2.0.5",
+ "stop-iteration-iterator": "^1.0.0"
},
- "engines": {
- "node": ">=10"
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/css-loader/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/es-module-lexer": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz",
+ "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==",
+ "license": "MIT"
},
- "node_modules/css-select": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz",
- "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==",
+ "node_modules/es-module-shims": {
+ "version": "1.8.2",
+ "license": "MIT"
+ },
+ "node_modules/es-object-atoms": {
+ "version": "1.1.1",
+ "license": "MIT",
"dependencies": {
- "boolbase": "^1.0.0",
- "css-what": "^6.1.0",
- "domhandler": "^5.0.2",
- "domutils": "^3.0.1",
- "nth-check": "^2.0.1"
+ "es-errors": "^1.3.0"
},
- "funding": {
- "url": "https://github.com/sponsors/fb55"
+ "engines": {
+ "node": ">= 0.4"
}
},
- "node_modules/css-what": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz",
- "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==",
- "engines": {
- "node": ">= 6"
+ "node_modules/es-set-tostringtag": {
+ "version": "2.1.0",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
},
- "funding": {
- "url": "https://github.com/sponsors/fb55"
+ "engines": {
+ "node": ">= 0.4"
}
},
- "node_modules/cssesc": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
- "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
- "dev": true,
+ "node_modules/esbuild": {
+ "version": "0.25.0",
+ "hasInstallScript": true,
+ "license": "MIT",
"bin": {
- "cssesc": "bin/cssesc"
+ "esbuild": "bin/esbuild"
},
"engines": {
- "node": ">=4"
+ "node": ">=18"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.25.0",
+ "@esbuild/android-arm": "0.25.0",
+ "@esbuild/android-arm64": "0.25.0",
+ "@esbuild/android-x64": "0.25.0",
+ "@esbuild/darwin-arm64": "0.25.0",
+ "@esbuild/darwin-x64": "0.25.0",
+ "@esbuild/freebsd-arm64": "0.25.0",
+ "@esbuild/freebsd-x64": "0.25.0",
+ "@esbuild/linux-arm": "0.25.0",
+ "@esbuild/linux-arm64": "0.25.0",
+ "@esbuild/linux-ia32": "0.25.0",
+ "@esbuild/linux-loong64": "0.25.0",
+ "@esbuild/linux-mips64el": "0.25.0",
+ "@esbuild/linux-ppc64": "0.25.0",
+ "@esbuild/linux-riscv64": "0.25.0",
+ "@esbuild/linux-s390x": "0.25.0",
+ "@esbuild/linux-x64": "0.25.0",
+ "@esbuild/netbsd-arm64": "0.25.0",
+ "@esbuild/netbsd-x64": "0.25.0",
+ "@esbuild/openbsd-arm64": "0.25.0",
+ "@esbuild/openbsd-x64": "0.25.0",
+ "@esbuild/sunos-x64": "0.25.0",
+ "@esbuild/win32-arm64": "0.25.0",
+ "@esbuild/win32-ia32": "0.25.0",
+ "@esbuild/win32-x64": "0.25.0"
}
},
- "node_modules/csstype": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
- "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
- },
- "node_modules/cytoscape": {
- "version": "3.28.1",
- "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.28.1.tgz",
- "integrity": "sha512-xyItz4O/4zp9/239wCcH8ZcFuuZooEeF8KHRmzjDfGdXsj3OG9MFSMA0pJE0uX3uCN/ygof6hHf4L7lst+JaDg==",
- "dependencies": {
- "heap": "^0.2.6",
- "lodash": "^4.17.21"
- },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "license": "MIT",
"engines": {
- "node": ">=0.10"
+ "node": ">=6"
}
},
- "node_modules/cytoscape-elk": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/cytoscape-elk/-/cytoscape-elk-2.2.0.tgz",
- "integrity": "sha512-EqXBVRcWeah/oBOifAmne0ImmIKntBVEQh2XCJXY++BgCufehZglRclrJ1DWm5Qm/NDBO/wEDijjgd50xJXw0A==",
- "dependencies": {
- "elkjs": "^0.8.1"
- },
- "peerDependencies": {
- "cytoscape": "^3.2.0"
- }
+ "node_modules/escape-html": {
+ "version": "1.0.3",
+ "license": "MIT"
},
- "node_modules/cytoscape-klay": {
- "version": "3.1.4",
- "resolved": "https://registry.npmjs.org/cytoscape-klay/-/cytoscape-klay-3.1.4.tgz",
- "integrity": "sha512-VwPj0VR25GPfy6qXVQRi/MYlZM/zkdvRhHlgqbM//lSvstgM6fhp3ik/uM8Wr8nlhskfqz/M1fIDmR6UckbS2A==",
- "dependencies": {
- "klayjs": "^0.4.1"
+ "node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
},
- "peerDependencies": {
- "cytoscape": "^3.2.0"
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/date-fns": {
- "version": "2.30.0",
- "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz",
- "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==",
+ "node_modules/eslint-scope": {
+ "version": "5.1.1",
"dev": true,
+ "license": "BSD-2-Clause",
+ "peer": true,
"dependencies": {
- "@babel/runtime": "^7.21.0"
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
},
"engines": {
- "node": ">=0.11"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/date-fns"
+ "node": ">=8.0.0"
}
},
- "node_modules/dayjs": {
- "version": "1.11.13",
- "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz",
- "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==",
- "license": "MIT"
- },
- "node_modules/debounce": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz",
- "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug=="
- },
- "node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
- "dependencies": {
- "ms": "2.1.2"
- },
+ "node_modules/esm": {
+ "version": "3.2.25",
+ "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz",
+ "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==",
+ "license": "MIT",
"engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
+ "node": ">=6"
}
},
- "node_modules/decamelize": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
- "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
- "license": "MIT",
+ "node_modules/esprima": {
+ "version": "4.0.1",
+ "license": "BSD-2-Clause",
+ "optional": true,
+ "peer": true,
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
"engines": {
- "node": ">=0.10.0"
+ "node": ">=4"
}
},
- "node_modules/decode-named-character-reference": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz",
- "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==",
- "dependencies": {
- "character-entities": "^2.0.0"
+ "node_modules/esprima-next": {
+ "version": "5.8.4",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
},
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
+ "engines": {
+ "node": ">=12"
}
},
- "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==",
- "license": "MIT",
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "peer": true,
"dependencies": {
- "mimic-response": "^3.1.0"
+ "estraverse": "^5.2.0"
},
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">=4.0"
}
},
- "node_modules/decompress-response/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==",
- "license": "MIT",
+ "node_modules/esrecurse/node_modules/estraverse": {
+ "version": "5.3.0",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "peer": true,
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">=4.0"
}
},
- "node_modules/deep-equal": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz",
- "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==",
+ "node_modules/estraverse": {
+ "version": "4.3.0",
"dev": true,
- "dependencies": {
- "array-buffer-byte-length": "^1.0.0",
- "call-bind": "^1.0.5",
- "es-get-iterator": "^1.1.3",
- "get-intrinsic": "^1.2.2",
- "is-arguments": "^1.1.1",
- "is-array-buffer": "^3.0.2",
- "is-date-object": "^1.0.5",
- "is-regex": "^1.1.4",
- "is-shared-array-buffer": "^1.0.2",
- "isarray": "^2.0.5",
- "object-is": "^1.1.5",
- "object-keys": "^1.1.1",
- "object.assign": "^4.1.4",
- "regexp.prototype.flags": "^1.5.1",
- "side-channel": "^1.0.4",
- "which-boxed-primitive": "^1.0.2",
- "which-collection": "^1.0.1",
- "which-typed-array": "^1.1.13"
- },
+ "license": "BSD-2-Clause",
+ "peer": true,
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">=4.0"
}
},
- "node_modules/deepmerge": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
- "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
+ "node_modules/estree-walker": {
+ "version": "2.0.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "license": "BSD-2-Clause",
+ "optional": true,
+ "peer": true,
"engines": {
"node": ">=0.10.0"
}
},
- "node_modules/defaults": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz",
- "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==",
+ "node_modules/etag": {
+ "version": "1.8.1",
"license": "MIT",
- "dependencies": {
- "clone": "^1.0.2"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "engines": {
+ "node": ">= 0.6"
}
},
- "node_modules/defer-to-connect": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz",
- "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==",
+ "node_modules/event-target-shim": {
+ "version": "5.0.1",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"engines": {
- "node": ">=10"
+ "node": ">=6"
}
},
- "node_modules/define-data-property": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.2.tgz",
- "integrity": "sha512-SRtsSqsDbgpJBbW3pABMCOt6rQyeM8s8RiyeSN8jYG8sYmt/kGJejbydttUsnDs1tadr19tvhT4ShwMyoqAm4g==",
- "dependencies": {
- "es-errors": "^1.3.0",
- "get-intrinsic": "^1.2.2",
- "gopd": "^1.0.1",
- "has-property-descriptors": "^1.0.1"
- },
+ "node_modules/eventemitter2": {
+ "version": "6.4.7",
+ "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz",
+ "integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/events": {
+ "version": "3.3.0",
+ "dev": true,
+ "license": "MIT",
"engines": {
- "node": ">= 0.4"
+ "node": ">=0.8.x"
}
},
- "node_modules/define-properties": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
- "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
+ "node_modules/evp_bytestokey": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
+ "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "define-data-property": "^1.0.1",
- "has-property-descriptors": "^1.0.0",
- "object-keys": "^1.1.1"
+ "md5.js": "^1.3.4",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "node_modules/execa": {
+ "version": "5.1.1",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^6.0.0",
+ "human-signals": "^2.1.0",
+ "is-stream": "^2.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^4.0.1",
+ "onetime": "^5.1.2",
+ "signal-exit": "^3.0.3",
+ "strip-final-newline": "^2.0.0"
},
"engines": {
- "node": ">= 0.4"
+ "node": ">=10"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/delayed-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
- "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/denodeify": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz",
- "integrity": "sha512-KNTihKNmQENUZeKu5fzfpzRqR5S2VMp4gl9RFHiWzj9DfvYQPMJ6XHKNaQxaGCXwPk6y9yme3aUoaiAe+KX+vg==",
- "license": "MIT"
- },
- "node_modules/depd": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
- "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
- "engines": {
- "node": ">= 0.8"
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
}
},
- "node_modules/deprecated-react-native-prop-types": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/deprecated-react-native-prop-types/-/deprecated-react-native-prop-types-4.2.3.tgz",
- "integrity": "sha512-2rLTiMKidIFFYpIVM69UnQKngLqQfL6I11Ch8wGSBftS18FUXda+o2we2950X+1dmbgps28niI3qwyH4eX3Z1g==",
+ "node_modules/executable": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz",
+ "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@react-native/normalize-colors": "<0.73.0",
- "invariant": "^2.2.4",
- "prop-types": "^15.8.1"
- }
- },
- "node_modules/dequal": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
- "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
+ "pify": "^2.2.0"
+ },
"engines": {
- "node": ">=6"
+ "node": ">=4"
}
},
- "node_modules/destroy": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
- "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
+ "node_modules/executable/node_modules/pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+ "dev": true,
"license": "MIT",
"engines": {
- "node": ">= 0.8",
- "npm": "1.2.8000 || >= 1.4.16"
+ "node": ">=0.10.0"
}
},
- "node_modules/diff": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz",
- "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==",
+ "node_modules/exenv-es6": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/exenv-es6/-/exenv-es6-1.1.1.tgz",
+ "integrity": "sha512-vlVu3N8d6yEMpMsEm+7sUBAI81aqYYuEvfK0jNqmdb/OPXzzH7QWDDnVjMvDSY47JdHEqx/dfC/q8WkfoTmpGQ==",
+ "license": "MIT"
+ },
+ "node_modules/express": {
+ "version": "4.21.2",
+ "license": "MIT",
+ "dependencies": {
+ "accepts": "~1.3.8",
+ "array-flatten": "1.1.1",
+ "body-parser": "1.20.3",
+ "content-disposition": "0.5.4",
+ "content-type": "~1.0.4",
+ "cookie": "0.7.1",
+ "cookie-signature": "1.0.6",
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "encodeurl": "~2.0.0",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "finalhandler": "1.3.1",
+ "fresh": "0.5.2",
+ "http-errors": "2.0.0",
+ "merge-descriptors": "1.0.3",
+ "methods": "~1.1.2",
+ "on-finished": "2.4.1",
+ "parseurl": "~1.3.3",
+ "path-to-regexp": "0.1.12",
+ "proxy-addr": "~2.0.7",
+ "qs": "6.13.0",
+ "range-parser": "~1.2.1",
+ "safe-buffer": "5.2.1",
+ "send": "0.19.0",
+ "serve-static": "1.16.2",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "type-is": "~1.6.18",
+ "utils-merge": "1.0.1",
+ "vary": "~1.1.2"
+ },
"engines": {
- "node": ">=0.3.1"
+ "node": ">= 0.10.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
- "node_modules/dom-accessibility-api": {
- "version": "0.5.16",
- "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz",
- "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==",
- "dev": true
- },
- "node_modules/dom-helpers": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz",
- "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==",
+ "node_modules/express/node_modules/debug": {
+ "version": "2.6.9",
+ "license": "MIT",
"dependencies": {
- "@babel/runtime": "^7.8.7",
- "csstype": "^3.0.2"
+ "ms": "2.0.0"
}
},
- "node_modules/dom-serializer": {
+ "node_modules/express/node_modules/ms": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
- "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
- "dependencies": {
- "domelementtype": "^2.3.0",
- "domhandler": "^5.0.2",
- "entities": "^4.2.0"
- },
- "funding": {
- "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
- }
+ "license": "MIT"
},
- "node_modules/domelementtype": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
- "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/fb55"
- }
- ]
+ "node_modules/extend": {
+ "version": "3.0.2",
+ "license": "MIT"
},
- "node_modules/domhandler": {
- "version": "5.0.3",
- "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
- "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
+ "node_modules/extract-zip": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz",
+ "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
"dependencies": {
- "domelementtype": "^2.3.0"
+ "debug": "^4.1.1",
+ "get-stream": "^5.1.0",
+ "yauzl": "^2.10.0"
},
- "engines": {
- "node": ">= 4"
+ "bin": {
+ "extract-zip": "cli.js"
},
- "funding": {
- "url": "https://github.com/fb55/domhandler?sponsor=1"
- }
- },
- "node_modules/domutils": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz",
- "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==",
- "dependencies": {
- "dom-serializer": "^2.0.0",
- "domelementtype": "^2.3.0",
- "domhandler": "^5.0.3"
+ "engines": {
+ "node": ">= 10.17.0"
},
- "funding": {
- "url": "https://github.com/fb55/domutils?sponsor=1"
- }
- },
- "node_modules/dot-case": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz",
- "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==",
- "dependencies": {
- "no-case": "^3.0.4",
- "tslib": "^2.0.3"
+ "optionalDependencies": {
+ "@types/yauzl": "^2.9.1"
}
},
- "node_modules/dunder-proto": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
- "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "node_modules/extract-zip/node_modules/get-stream": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
+ "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "call-bind-apply-helpers": "^1.0.1",
- "es-errors": "^1.3.0",
- "gopd": "^1.2.0"
+ "pump": "^3.0.0"
},
"engines": {
- "node": ">= 0.4"
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/ee-first": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
- "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
- },
- "node_modules/electron-to-chromium": {
- "version": "1.5.36",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.36.tgz",
- "integrity": "sha512-HYTX8tKge/VNp6FGO+f/uVDmUkq+cEfcxYhKf15Akc4M5yxt5YmorwlAitKWjWhWQnKcDRBAQKXkhqqXMqcrjw==",
- "license": "ISC"
+ "node_modules/extsprintf": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+ "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==",
+ "engines": [
+ "node >=0.6.0"
+ ],
+ "license": "MIT"
},
- "node_modules/elkjs": {
- "version": "0.8.2",
- "resolved": "https://registry.npmjs.org/elkjs/-/elkjs-0.8.2.tgz",
- "integrity": "sha512-L6uRgvZTH+4OF5NE/MBbzQx/WYpru1xCBE9respNj6qznEewGUIfhzmm7horWWxbNO2M0WckQypGctR8lH79xQ=="
+ "node_modules/fast-content-type-parse": {
+ "version": "2.0.1",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fastify"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fastify"
+ }
+ ],
+ "license": "MIT"
},
- "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=="
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "license": "MIT"
},
- "node_modules/emojis-list": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
- "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
+ "node_modules/fast-fifo": {
+ "version": "1.3.2",
"dev": true,
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/encodeurl": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
- "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.8"
- }
+ "license": "MIT"
},
- "node_modules/enhanced-resolve": {
- "version": "5.17.1",
- "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz",
- "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==",
+ "node_modules/fast-glob": {
+ "version": "3.3.3",
"dev": true,
"license": "MIT",
"dependencies": {
- "graceful-fs": "^4.2.4",
- "tapable": "^2.2.0"
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.8"
},
"engines": {
- "node": ">=10.13.0"
+ "node": ">=8.6.0"
}
},
- "node_modules/ensure-type": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/ensure-type/-/ensure-type-1.5.1.tgz",
- "integrity": "sha512-Dxe+mVF4MupV6eueWiFa6hUd9OL9lIM2/LqR40k1P+dwG+G2il2UigXTU9aQlaw+Y/N0BKSaTofNw73htTbC5g==",
- "dev": true
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "license": "MIT"
},
- "node_modules/entities": {
+ "node_modules/fast-plist": {
+ "version": "0.1.3",
+ "license": "MIT"
+ },
+ "node_modules/fast-xml-parser": {
"version": "4.5.0",
- "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
- "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
- "engines": {
- "node": ">=0.12"
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/NaturalIntelligence"
+ },
+ {
+ "type": "paypal",
+ "url": "https://paypal.me/naturalintelligence"
+ }
+ ],
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "strnum": "^1.0.5"
},
- "funding": {
- "url": "https://github.com/fb55/entities?sponsor=1"
+ "bin": {
+ "fxparser": "src/cli/cli.js"
}
},
- "node_modules/envinfo": {
- "version": "7.14.0",
- "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.14.0.tgz",
- "integrity": "sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==",
+ "node_modules/fastq": {
+ "version": "1.17.1",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/fault": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz",
+ "integrity": "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==",
"license": "MIT",
- "bin": {
- "envinfo": "dist/cli.js"
+ "dependencies": {
+ "format": "^0.2.0"
},
- "engines": {
- "node": ">=4"
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
}
},
- "node_modules/eol": {
- "version": "0.9.1",
- "resolved": "https://registry.npmjs.org/eol/-/eol-0.9.1.tgz",
- "integrity": "sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg==",
- "dev": true
- },
- "node_modules/error-ex": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
- "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+ "node_modules/fb-watchman": {
+ "version": "2.0.2",
+ "license": "Apache-2.0",
+ "optional": true,
+ "peer": true,
"dependencies": {
- "is-arrayish": "^0.2.1"
+ "bser": "2.1.1"
}
},
- "node_modules/error-stack-parser": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz",
- "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==",
+ "node_modules/fd-slicer": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
+ "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "stackframe": "^1.3.4"
+ "pend": "~1.2.0"
}
},
- "node_modules/errorhandler": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.5.1.tgz",
- "integrity": "sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A==",
+ "node_modules/figures": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
+ "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "accepts": "~1.3.7",
- "escape-html": "~1.0.3"
+ "escape-string-regexp": "^1.0.5"
},
"engines": {
- "node": ">= 0.8"
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/es-define-property": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
- "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+ "node_modules/figures/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true,
"license": "MIT",
"engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/es-errors": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
- "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
- "engines": {
- "node": ">= 0.4"
+ "node": ">=0.8.0"
}
},
- "node_modules/es-get-iterator": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz",
- "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==",
+ "node_modules/file-loader": {
+ "version": "6.2.0",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.1.3",
- "has-symbols": "^1.0.3",
- "is-arguments": "^1.1.1",
- "is-map": "^2.0.2",
- "is-set": "^2.0.2",
- "is-string": "^1.0.7",
- "isarray": "^2.0.5",
- "stop-iteration-iterator": "^1.0.0"
+ "loader-utils": "^2.0.0",
+ "schema-utils": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^4.0.0 || ^5.0.0"
}
},
- "node_modules/es-module-lexer": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz",
- "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==",
- "dev": true,
- "peer": true
- },
- "node_modules/es-module-shims": {
- "version": "1.8.2",
- "resolved": "https://registry.npmjs.org/es-module-shims/-/es-module-shims-1.8.2.tgz",
- "integrity": "sha512-7vIYVzpOhXtpc3Yn03itB+GSgVZFW7oL4kdydA+iL+IEi7HiSLBUxM05QFw4SxTl6e++pMpGqZPo2+vdNs3TbA=="
+ "node_modules/file-saver": {
+ "version": "2.0.5",
+ "license": "MIT"
},
- "node_modules/es-object-atoms": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
- "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
- "es-errors": "^1.3.0"
+ "to-regex-range": "^5.0.1"
},
"engines": {
- "node": ">= 0.4"
+ "node": ">=8"
}
},
- "node_modules/es-set-tostringtag": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
- "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
+ "node_modules/finalhandler": {
+ "version": "1.3.1",
"license": "MIT",
"dependencies": {
- "es-errors": "^1.3.0",
- "get-intrinsic": "^1.2.6",
- "has-tostringtag": "^1.0.2",
- "hasown": "^2.0.2"
+ "debug": "2.6.9",
+ "encodeurl": "~2.0.0",
+ "escape-html": "~1.0.3",
+ "on-finished": "2.4.1",
+ "parseurl": "~1.3.3",
+ "statuses": "2.0.1",
+ "unpipe": "~1.0.0"
},
"engines": {
- "node": ">= 0.4"
+ "node": ">= 0.8"
}
},
- "node_modules/esbuild": {
- "version": "0.25.0",
- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.0.tgz",
- "integrity": "sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==",
- "hasInstallScript": true,
+ "node_modules/finalhandler/node_modules/debug": {
+ "version": "2.6.9",
"license": "MIT",
- "bin": {
- "esbuild": "bin/esbuild"
- },
- "engines": {
- "node": ">=18"
- },
- "optionalDependencies": {
- "@esbuild/aix-ppc64": "0.25.0",
- "@esbuild/android-arm": "0.25.0",
- "@esbuild/android-arm64": "0.25.0",
- "@esbuild/android-x64": "0.25.0",
- "@esbuild/darwin-arm64": "0.25.0",
- "@esbuild/darwin-x64": "0.25.0",
- "@esbuild/freebsd-arm64": "0.25.0",
- "@esbuild/freebsd-x64": "0.25.0",
- "@esbuild/linux-arm": "0.25.0",
- "@esbuild/linux-arm64": "0.25.0",
- "@esbuild/linux-ia32": "0.25.0",
- "@esbuild/linux-loong64": "0.25.0",
- "@esbuild/linux-mips64el": "0.25.0",
- "@esbuild/linux-ppc64": "0.25.0",
- "@esbuild/linux-riscv64": "0.25.0",
- "@esbuild/linux-s390x": "0.25.0",
- "@esbuild/linux-x64": "0.25.0",
- "@esbuild/netbsd-arm64": "0.25.0",
- "@esbuild/netbsd-x64": "0.25.0",
- "@esbuild/openbsd-arm64": "0.25.0",
- "@esbuild/openbsd-x64": "0.25.0",
- "@esbuild/sunos-x64": "0.25.0",
- "@esbuild/win32-arm64": "0.25.0",
- "@esbuild/win32-ia32": "0.25.0",
- "@esbuild/win32-x64": "0.25.0"
+ "dependencies": {
+ "ms": "2.0.0"
}
},
- "node_modules/escalade": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
- "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "node_modules/finalhandler/node_modules/ms": {
+ "version": "2.0.0",
+ "license": "MIT"
+ },
+ "node_modules/find-cache-dir": {
+ "version": "2.1.0",
"license": "MIT",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "commondir": "^1.0.1",
+ "make-dir": "^2.0.0",
+ "pkg-dir": "^3.0.0"
+ },
"engines": {
"node": ">=6"
}
},
- "node_modules/escape-html": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
- "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
+ "node_modules/find-root": {
+ "version": "1.1.0",
+ "license": "MIT"
},
- "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==",
+ "node_modules/find-up": {
+ "version": "5.0.0",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
"engines": {
"node": ">=10"
},
@@ -8561,395 +9768,324 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/eslint-scope": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
- "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
- "dev": true,
+ "node_modules/flow-enums-runtime": {
+ "version": "0.0.5",
+ "license": "MIT",
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/flow-parser": {
+ "version": "0.206.0",
+ "license": "MIT",
+ "optional": true,
"peer": true,
- "dependencies": {
- "esrecurse": "^4.3.0",
- "estraverse": "^4.1.1"
- },
"engines": {
- "node": ">=8.0.0"
+ "node": ">=0.4.0"
}
},
- "node_modules/esprima": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
- "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
- "bin": {
- "esparse": "bin/esparse.js",
- "esvalidate": "bin/esvalidate.js"
- },
+ "node_modules/follow-redirects": {
+ "version": "1.15.9",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
+ "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "license": "MIT",
"engines": {
- "node": ">=4"
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
}
},
- "node_modules/esprima-next": {
- "version": "5.8.4",
- "resolved": "https://registry.npmjs.org/esprima-next/-/esprima-next-5.8.4.tgz",
- "integrity": "sha512-8nYVZ4ioIH4Msjb/XmhnBdz5WRRBaYqevKa1cv9nGJdCehMbzZCPNEEnqfLCZVetUVrUPEcb5IYyu1GG4hFqgg==",
+ "node_modules/for-each": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz",
+ "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==",
"dev": true,
- "bin": {
- "esparse": "bin/esparse.js",
- "esvalidate": "bin/esvalidate.js"
+ "license": "MIT",
+ "dependencies": {
+ "is-callable": "^1.2.7"
},
"engines": {
- "node": ">=12"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "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,
- "peer": true,
- "dependencies": {
- "estraverse": "^5.2.0"
- },
+ "node_modules/forever-agent": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+ "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==",
+ "license": "Apache-2.0",
"engines": {
- "node": ">=4.0"
+ "node": "*"
}
},
- "node_modules/esrecurse/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,
- "peer": true,
+ "node_modules/form-data": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.3.tgz",
+ "integrity": "sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==",
+ "license": "MIT",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "es-set-tostringtag": "^2.1.0",
+ "hasown": "^2.0.2",
+ "mime-types": "^2.1.12"
+ },
"engines": {
- "node": ">=4.0"
+ "node": ">= 6"
}
},
- "node_modules/estraverse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
- "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
- "dev": true,
- "peer": true,
+ "node_modules/form-data-encoder": {
+ "version": "4.0.2",
+ "license": "MIT",
"engines": {
- "node": ">=4.0"
+ "node": ">= 18"
}
},
- "node_modules/estree-walker": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
- "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
- "license": "MIT"
- },
- "node_modules/esutils": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
- "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
- "peer": true,
+ "node_modules/format": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz",
+ "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==",
"engines": {
- "node": ">=0.10.0"
+ "node": ">=0.4.x"
}
},
- "node_modules/etag": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
- "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
+ "node_modules/forwarded": {
+ "version": "0.2.0",
+ "license": "MIT",
"engines": {
"node": ">= 0.6"
}
},
- "node_modules/event-target-shim": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
- "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==",
+ "node_modules/fresh": {
+ "version": "0.5.2",
+ "license": "MIT",
"engines": {
- "node": ">=6"
+ "node": ">= 0.6"
}
},
- "node_modules/events": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
- "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
- "dev": true,
+ "node_modules/fs-extra": {
+ "version": "8.1.0",
+ "license": "MIT",
+ "optional": true,
"peer": true,
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ },
"engines": {
- "node": ">=0.8.x"
+ "node": ">=6 <7 || >=8"
}
},
- "node_modules/execa": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
- "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+ "node_modules/fs-mkdirp-stream": {
+ "version": "2.0.1",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "cross-spawn": "^7.0.3",
- "get-stream": "^6.0.0",
- "human-signals": "^2.1.0",
- "is-stream": "^2.0.0",
- "merge-stream": "^2.0.0",
- "npm-run-path": "^4.0.1",
- "onetime": "^5.1.2",
- "signal-exit": "^3.0.3",
- "strip-final-newline": "^2.0.0"
+ "graceful-fs": "^4.2.8",
+ "streamx": "^2.12.0"
},
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ "node": ">=10.13.0"
}
},
- "node_modules/express": {
- "version": "4.21.2",
- "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz",
- "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==",
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "license": "ISC",
+ "optional": true,
+ "peer": 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==",
+ "hasInstallScript": true,
"license": "MIT",
- "dependencies": {
- "accepts": "~1.3.8",
- "array-flatten": "1.1.1",
- "body-parser": "1.20.3",
- "content-disposition": "0.5.4",
- "content-type": "~1.0.4",
- "cookie": "0.7.1",
- "cookie-signature": "1.0.6",
- "debug": "2.6.9",
- "depd": "2.0.0",
- "encodeurl": "~2.0.0",
- "escape-html": "~1.0.3",
- "etag": "~1.8.1",
- "finalhandler": "1.3.1",
- "fresh": "0.5.2",
- "http-errors": "2.0.0",
- "merge-descriptors": "1.0.3",
- "methods": "~1.1.2",
- "on-finished": "2.4.1",
- "parseurl": "~1.3.3",
- "path-to-regexp": "0.1.12",
- "proxy-addr": "~2.0.7",
- "qs": "6.13.0",
- "range-parser": "~1.2.1",
- "safe-buffer": "5.2.1",
- "send": "0.19.0",
- "serve-static": "1.16.2",
- "setprototypeof": "1.2.0",
- "statuses": "2.0.1",
- "type-is": "~1.6.18",
- "utils-merge": "1.0.1",
- "vary": "~1.1.2"
- },
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
"engines": {
- "node": ">= 0.10.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/express"
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
}
},
- "node_modules/express/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dependencies": {
- "ms": "2.0.0"
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/express/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
- },
- "node_modules/extend": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
- "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
- },
- "node_modules/fast-content-type-parse": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-2.0.1.tgz",
- "integrity": "sha512-nGqtvLrj5w0naR6tDPfB4cUmYCqouzyQiz6C5y/LtcDllJdrcc6WaWW6iXyIIOErTa/XRybj28aasdn4LkVk6Q==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/fastify"
- },
- {
- "type": "opencollective",
- "url": "https://opencollective.com/fastify"
- }
- ],
- "license": "MIT"
+ "node_modules/functions-have-names": {
+ "version": "1.2.3",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
},
- "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/gensync": {
+ "version": "1.0.0-beta.2",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
},
- "node_modules/fast-fifo": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz",
- "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==",
- "dev": true
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "license": "ISC",
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
},
- "node_modules/fast-glob": {
- "version": "3.3.3",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
- "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
+ "node_modules/get-intrinsic": {
+ "version": "1.3.0",
"license": "MIT",
"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.8"
+ "call-bind-apply-helpers": "^1.0.2",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "function-bind": "^1.1.2",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.1.0"
},
"engines": {
- "node": ">=8.6.0"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "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-plist": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/fast-plist/-/fast-plist-0.1.3.tgz",
- "integrity": "sha512-d9cEfo/WcOezgPLAC/8t8wGb6YOD6JTCPMw2QcG2nAdFmyY+9rTUizCTaGjIZAloWENTEUMAPpkUAIJJJ0i96A=="
- },
- "node_modules/fast-xml-parser": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.0.tgz",
- "integrity": "sha512-/PlTQCI96+fZMAOLMZK4CWG1ItCbfZ/0jx7UIJFChPNrx7tcEgerUgWbeieCM9MfHInUDyK8DWYZ+YrywDJuTg==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/NaturalIntelligence"
- },
- {
- "type": "paypal",
- "url": "https://paypal.me/naturalintelligence"
- }
- ],
+ "node_modules/get-proto": {
+ "version": "1.0.1",
"license": "MIT",
"dependencies": {
- "strnum": "^1.0.5"
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
},
- "bin": {
- "fxparser": "src/cli/cli.js"
+ "engines": {
+ "node": ">= 0.4"
}
},
- "node_modules/fastq": {
- "version": "1.17.1",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz",
- "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==",
+ "node_modules/get-stream": {
+ "version": "6.0.1",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/getos": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz",
+ "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "reusify": "^1.0.4"
+ "async": "^3.2.0"
}
},
- "node_modules/fb-watchman": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz",
- "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==",
- "license": "Apache-2.0",
+ "node_modules/getpass": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+ "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==",
+ "license": "MIT",
"dependencies": {
- "bser": "2.1.1"
+ "assert-plus": "^1.0.0"
}
},
- "node_modules/file-loader": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz",
- "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==",
- "dev": true,
+ "node_modules/glob": {
+ "version": "7.2.3",
+ "license": "ISC",
+ "optional": true,
+ "peer": true,
"dependencies": {
- "loader-utils": "^2.0.0",
- "schema-utils": "^3.0.0"
+ "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": ">= 10.13.0"
+ "node": "*"
},
"funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "webpack": "^4.0.0 || ^5.0.0"
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/file-saver": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz",
- "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA=="
- },
- "node_modules/fill-range": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
- "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
- "license": "MIT",
+ "node_modules/glob-parent": {
+ "version": "5.1.2",
+ "dev": true,
+ "license": "ISC",
"dependencies": {
- "to-regex-range": "^5.0.1"
+ "is-glob": "^4.0.1"
},
"engines": {
- "node": ">=8"
+ "node": ">= 6"
}
},
- "node_modules/finalhandler": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz",
- "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==",
+ "node_modules/glob-stream": {
+ "version": "8.0.0",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "debug": "2.6.9",
- "encodeurl": "~2.0.0",
- "escape-html": "~1.0.3",
- "on-finished": "2.4.1",
- "parseurl": "~1.3.3",
- "statuses": "2.0.1",
- "unpipe": "~1.0.0"
+ "@gulpjs/to-absolute-glob": "^4.0.0",
+ "anymatch": "^3.1.3",
+ "fastq": "^1.13.0",
+ "glob-parent": "^6.0.2",
+ "is-glob": "^4.0.3",
+ "is-negated-glob": "^1.0.0",
+ "normalize-path": "^3.0.0",
+ "streamx": "^2.12.5"
},
"engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/finalhandler/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "license": "MIT",
- "dependencies": {
- "ms": "2.0.0"
+ "node": ">=10.13.0"
}
},
- "node_modules/finalhandler/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
- "license": "MIT"
- },
- "node_modules/find-cache-dir": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz",
- "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==",
+ "node_modules/glob-stream/node_modules/glob-parent": {
+ "version": "6.0.2",
+ "dev": true,
+ "license": "ISC",
"dependencies": {
- "commondir": "^1.0.1",
- "make-dir": "^2.0.0",
- "pkg-dir": "^3.0.0"
+ "is-glob": "^4.0.3"
},
"engines": {
- "node": ">=6"
+ "node": ">=10.13.0"
}
},
- "node_modules/find-root": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz",
- "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng=="
+ "node_modules/glob-to-regexp": {
+ "version": "0.4.1",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "peer": true
},
- "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==",
+ "node_modules/global-dirs": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz",
+ "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "locate-path": "^6.0.0",
- "path-exists": "^4.0.0"
+ "ini": "2.0.0"
},
"engines": {
"node": ">=10"
@@ -8958,498 +10094,610 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/flow-enums-runtime": {
- "version": "0.0.5",
- "resolved": "https://registry.npmjs.org/flow-enums-runtime/-/flow-enums-runtime-0.0.5.tgz",
- "integrity": "sha512-PSZF9ZuaZD03sT9YaIs0FrGJ7lSUw7rHZIex+73UYVXg46eL/wxN5PaVcPJFudE2cJu5f0fezitV5aBkLHPUOQ=="
- },
- "node_modules/flow-parser": {
- "version": "0.206.0",
- "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.206.0.tgz",
- "integrity": "sha512-HVzoK3r6Vsg+lKvlIZzaWNBVai+FXTX1wdYhz/wVlH13tb/gOdLXmlTqy6odmTBhT5UoWUbq0k8263Qhr9d88w==",
+ "node_modules/globals": {
+ "version": "11.12.0",
+ "license": "MIT",
"engines": {
- "node": ">=0.4.0"
+ "node": ">=4"
}
},
- "node_modules/follow-redirects": {
- "version": "1.15.6",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz",
- "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==",
- "funding": [
- {
- "type": "individual",
- "url": "https://github.com/sponsors/RubenVerborgh"
- }
- ],
+ "node_modules/gopd": {
+ "version": "1.2.0",
+ "license": "MIT",
"engines": {
- "node": ">=4.0"
+ "node": ">= 0.4"
},
- "peerDependenciesMeta": {
- "debug": {
- "optional": true
- }
- }
- },
- "node_modules/for-each": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
- "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
- "dev": true,
- "dependencies": {
- "is-callable": "^1.1.3"
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/form-data": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
- "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+ "node_modules/got": {
+ "version": "14.4.6",
+ "license": "MIT",
"dependencies": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.8",
- "mime-types": "^2.1.12"
+ "@sindresorhus/is": "^7.0.1",
+ "@szmarczak/http-timer": "^5.0.1",
+ "cacheable-lookup": "^7.0.0",
+ "cacheable-request": "^12.0.1",
+ "decompress-response": "^6.0.0",
+ "form-data-encoder": "^4.0.2",
+ "http2-wrapper": "^2.2.1",
+ "lowercase-keys": "^3.0.0",
+ "p-cancelable": "^4.0.1",
+ "responselike": "^3.0.0",
+ "type-fest": "^4.26.1"
},
"engines": {
- "node": ">= 6"
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/got?sponsor=1"
}
},
- "node_modules/form-data-encoder": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-4.0.2.tgz",
- "integrity": "sha512-KQVhvhK8ZkWzxKxOr56CPulAhH3dobtuQ4+hNQ+HekH/Wp5gSOafqRAeTphQUJAIk0GBvHZgJ2ZGRWd5kphMuw==",
- "license": "MIT",
- "engines": {
- "node": ">= 18"
- }
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "devOptional": true,
+ "license": "ISC"
},
- "node_modules/forwarded": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
- "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
- "engines": {
- "node": ">= 0.6"
+ "node_modules/gulp-sort": {
+ "version": "2.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "through2": "^2.0.1"
}
},
- "node_modules/fresh": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
- "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
+ "node_modules/har-schema": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
+ "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==",
+ "license": "ISC",
"engines": {
- "node": ">= 0.6"
+ "node": ">=4"
}
},
- "node_modules/fs-extra": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
- "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
+ "node_modules/har-validator": {
+ "version": "5.1.5",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
+ "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
+ "deprecated": "this library is no longer supported",
"license": "MIT",
"dependencies": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^4.0.0",
- "universalify": "^0.1.0"
+ "ajv": "^6.12.3",
+ "har-schema": "^2.0.0"
},
"engines": {
- "node": ">=6 <7 || >=8"
+ "node": ">=6"
}
},
- "node_modules/fs-mkdirp-stream": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-2.0.1.tgz",
- "integrity": "sha512-UTOY+59K6IA94tec8Wjqm0FSh5OVudGNB0NL/P6fB3HiE3bYOY3VYBGijsnOHNkQSwC1FKkU77pmq7xp9CskLw==",
+ "node_modules/has-bigints": {
+ "version": "1.0.2",
"dev": true,
- "dependencies": {
- "graceful-fs": "^4.2.8",
- "streamx": "^2.12.0"
- },
- "engines": {
- "node": ">=10.13.0"
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "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=="
- },
- "node_modules/fsevents": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
- "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
- "hasInstallScript": true,
- "optional": true,
- "os": [
- "darwin"
- ],
+ "node_modules/has-flag": {
+ "version": "3.0.0",
+ "dev": true,
+ "license": "MIT",
"engines": {
- "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ "node": ">=4"
}
},
- "node_modules/function-bind": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
- "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "node_modules/has-property-descriptors": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
+ "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-define-property": "^1.0.0"
+ },
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/functions-have-names": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
- "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
- "dev": true,
+ "node_modules/has-symbols": {
+ "version": "1.1.0",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/gensync": {
- "version": "1.0.0-beta.2",
- "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
- "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "node_modules/has-tostringtag": {
+ "version": "1.0.2",
+ "license": "MIT",
+ "dependencies": {
+ "has-symbols": "^1.0.3"
+ },
"engines": {
- "node": ">=6.9.0"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "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==",
+ "node_modules/hash-base": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.5.tgz",
+ "integrity": "sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.4",
+ "safe-buffer": "^5.2.1"
+ },
"engines": {
- "node": "6.* || 8.* || >= 10.*"
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/hash.js": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
+ "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "minimalistic-assert": "^1.0.1"
}
},
- "node_modules/get-intrinsic": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
- "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+ "node_modules/hasown": {
+ "version": "2.0.2",
"license": "MIT",
"dependencies": {
- "call-bind-apply-helpers": "^1.0.2",
- "es-define-property": "^1.0.1",
- "es-errors": "^1.3.0",
- "es-object-atoms": "^1.1.1",
- "function-bind": "^1.1.2",
- "get-proto": "^1.0.1",
- "gopd": "^1.2.0",
- "has-symbols": "^1.1.0",
- "hasown": "^2.0.2",
- "math-intrinsics": "^1.1.0"
+ "function-bind": "^1.1.2"
},
"engines": {
"node": ">= 0.4"
+ }
+ },
+ "node_modules/hast-util-from-dom": {
+ "version": "4.2.0",
+ "license": "ISC",
+ "dependencies": {
+ "hastscript": "^7.0.0",
+ "web-namespaces": "^2.0.0"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
}
},
- "node_modules/get-proto": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
- "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "node_modules/hast-util-from-html": {
+ "version": "1.0.2",
"license": "MIT",
"dependencies": {
- "dunder-proto": "^1.0.1",
- "es-object-atoms": "^1.0.0"
+ "@types/hast": "^2.0.0",
+ "hast-util-from-parse5": "^7.0.0",
+ "parse5": "^7.0.0",
+ "vfile": "^5.0.0",
+ "vfile-message": "^3.0.0"
},
- "engines": {
- "node": ">= 0.4"
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
}
},
- "node_modules/get-stream": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
- "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+ "node_modules/hast-util-from-html-isomorphic": {
+ "version": "1.0.0",
"license": "MIT",
- "engines": {
- "node": ">=10"
+ "dependencies": {
+ "@types/hast": "^2.0.0",
+ "hast-util-from-dom": "^4.0.0",
+ "hast-util-from-html": "^1.0.0",
+ "unist-util-remove-position": "^4.0.0"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
}
},
- "node_modules/glob": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "node_modules/hast-util-from-parse5": {
+ "version": "7.1.2",
+ "license": "MIT",
"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": "*"
+ "@types/hast": "^2.0.0",
+ "@types/unist": "^2.0.0",
+ "hastscript": "^7.0.0",
+ "property-information": "^6.0.0",
+ "vfile": "^5.0.0",
+ "vfile-location": "^4.0.0",
+ "web-namespaces": "^2.0.0"
},
"funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
}
},
- "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==",
+ "node_modules/hast-util-is-element": {
+ "version": "2.1.3",
+ "license": "MIT",
"dependencies": {
- "is-glob": "^4.0.1"
+ "@types/hast": "^2.0.0",
+ "@types/unist": "^2.0.0"
},
- "engines": {
- "node": ">= 6"
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
}
},
- "node_modules/glob-stream": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-8.0.0.tgz",
- "integrity": "sha512-CdIUuwOkYNv9ZadR3jJvap8CMooKziQZ/QCSPhEb7zqfsEI5YnPmvca7IvbaVE3z58ZdUYD2JsU6AUWjL8WZJA==",
- "dev": true,
+ "node_modules/hast-util-parse-selector": {
+ "version": "3.1.1",
+ "license": "MIT",
"dependencies": {
- "@gulpjs/to-absolute-glob": "^4.0.0",
- "anymatch": "^3.1.3",
- "fastq": "^1.13.0",
- "glob-parent": "^6.0.2",
- "is-glob": "^4.0.3",
- "is-negated-glob": "^1.0.0",
- "normalize-path": "^3.0.0",
- "streamx": "^2.12.5"
+ "@types/hast": "^2.0.0"
},
- "engines": {
- "node": ">=10.13.0"
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
}
},
- "node_modules/glob-stream/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,
+ "node_modules/hast-util-raw": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz",
+ "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==",
+ "license": "MIT",
"dependencies": {
- "is-glob": "^4.0.3"
+ "@types/hast": "^3.0.0",
+ "@types/unist": "^3.0.0",
+ "@ungap/structured-clone": "^1.0.0",
+ "hast-util-from-parse5": "^8.0.0",
+ "hast-util-to-parse5": "^8.0.0",
+ "html-void-elements": "^3.0.0",
+ "mdast-util-to-hast": "^13.0.0",
+ "parse5": "^7.0.0",
+ "unist-util-position": "^5.0.0",
+ "unist-util-visit": "^5.0.0",
+ "vfile": "^6.0.0",
+ "web-namespaces": "^2.0.0",
+ "zwitch": "^2.0.0"
},
- "engines": {
- "node": ">=10.13.0"
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
}
},
- "node_modules/glob-to-regexp": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
- "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
- "dev": true,
- "license": "BSD-2-Clause",
- "peer": true
+ "node_modules/hast-util-raw/node_modules/@types/hast": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz",
+ "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
},
- "node_modules/globals": {
- "version": "11.12.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
- "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
- "engines": {
- "node": ">=4"
+ "node_modules/hast-util-raw/node_modules/@types/mdast": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
+ "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
}
},
- "node_modules/gopd": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
- "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "node_modules/hast-util-raw/node_modules/@types/unist": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
+ "license": "MIT"
+ },
+ "node_modules/hast-util-raw/node_modules/hast-util-from-parse5": {
+ "version": "8.0.3",
+ "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz",
+ "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==",
"license": "MIT",
- "engines": {
- "node": ">= 0.4"
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/unist": "^3.0.0",
+ "devlop": "^1.0.0",
+ "hastscript": "^9.0.0",
+ "property-information": "^7.0.0",
+ "vfile": "^6.0.0",
+ "vfile-location": "^5.0.0",
+ "web-namespaces": "^2.0.0"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
}
},
- "node_modules/got": {
- "version": "14.4.6",
- "resolved": "https://registry.npmjs.org/got/-/got-14.4.6.tgz",
- "integrity": "sha512-rnhwfM/PhMNJ1i17k3DuDqgj0cKx3IHxBKVv/WX1uDKqrhi2Gv3l7rhPThR/Cc6uU++dD97W9c8Y0qyw9x0jag==",
+ "node_modules/hast-util-raw/node_modules/hast-util-parse-selector": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz",
+ "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==",
"license": "MIT",
"dependencies": {
- "@sindresorhus/is": "^7.0.1",
- "@szmarczak/http-timer": "^5.0.1",
- "cacheable-lookup": "^7.0.0",
- "cacheable-request": "^12.0.1",
- "decompress-response": "^6.0.0",
- "form-data-encoder": "^4.0.2",
- "http2-wrapper": "^2.2.1",
- "lowercase-keys": "^3.0.0",
- "p-cancelable": "^4.0.1",
- "responselike": "^3.0.0",
- "type-fest": "^4.26.1"
+ "@types/hast": "^3.0.0"
},
- "engines": {
- "node": ">=20"
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-raw/node_modules/hastscript": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz",
+ "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "comma-separated-tokens": "^2.0.0",
+ "hast-util-parse-selector": "^4.0.0",
+ "property-information": "^7.0.0",
+ "space-separated-tokens": "^2.0.0"
},
"funding": {
- "url": "https://github.com/sindresorhus/got?sponsor=1"
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
}
},
- "node_modules/graceful-fs": {
- "version": "4.2.11",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
- "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
+ "node_modules/hast-util-raw/node_modules/mdast-util-to-hast": {
+ "version": "13.2.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz",
+ "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "@ungap/structured-clone": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "trim-lines": "^3.0.0",
+ "unist-util-position": "^5.0.0",
+ "unist-util-visit": "^5.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
},
- "node_modules/gulp-sort": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/gulp-sort/-/gulp-sort-2.0.0.tgz",
- "integrity": "sha512-MyTel3FXOdh1qhw1yKhpimQrAmur9q1X0ZigLmCOxouQD+BD3za9/89O+HfbgBQvvh4igEbp0/PUWO+VqGYG1g==",
- "dev": true,
+ "node_modules/hast-util-raw/node_modules/micromark-util-character": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz",
+ "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
"dependencies": {
- "through2": "^2.0.1"
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
}
},
- "node_modules/has-bigints": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
- "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==",
- "dev": true,
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node_modules/hast-util-raw/node_modules/micromark-util-encode": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz",
+ "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/hast-util-raw/node_modules/micromark-util-sanitize-uri": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz",
+ "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-encode": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0"
}
},
- "node_modules/has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
+ "node_modules/hast-util-raw/node_modules/micromark-util-symbol": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz",
+ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/hast-util-raw/node_modules/micromark-util-types": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz",
+ "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
},
- "node_modules/has-property-descriptors": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz",
- "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==",
- "dependencies": {
- "get-intrinsic": "^1.2.2"
- },
+ "node_modules/hast-util-raw/node_modules/property-information": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz",
+ "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==",
+ "license": "MIT",
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
}
},
- "node_modules/has-symbols": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
- "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+ "node_modules/hast-util-raw/node_modules/unist-util-is": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz",
+ "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==",
"license": "MIT",
- "engines": {
- "node": ">= 0.4"
+ "dependencies": {
+ "@types/unist": "^3.0.0"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
}
},
- "node_modules/has-tostringtag": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
- "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+ "node_modules/hast-util-raw/node_modules/unist-util-position": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz",
+ "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==",
+ "license": "MIT",
"dependencies": {
- "has-symbols": "^1.0.3"
- },
- "engines": {
- "node": ">= 0.4"
+ "@types/unist": "^3.0.0"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
}
},
- "node_modules/hasown": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
- "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "node_modules/hast-util-raw/node_modules/unist-util-stringify-position": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz",
+ "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==",
"license": "MIT",
"dependencies": {
- "function-bind": "^1.1.2"
+ "@types/unist": "^3.0.0"
},
- "engines": {
- "node": ">= 0.4"
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
}
},
- "node_modules/hast-util-from-dom": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/hast-util-from-dom/-/hast-util-from-dom-4.2.0.tgz",
- "integrity": "sha512-t1RJW/OpJbCAJQeKi3Qrj1cAOLA0+av/iPFori112+0X7R3wng+jxLA+kXec8K4szqPRGI8vPxbbpEYvvpwaeQ==",
+ "node_modules/hast-util-raw/node_modules/unist-util-visit": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz",
+ "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==",
+ "license": "MIT",
"dependencies": {
- "hastscript": "^7.0.0",
- "web-namespaces": "^2.0.0"
+ "@types/unist": "^3.0.0",
+ "unist-util-is": "^6.0.0",
+ "unist-util-visit-parents": "^6.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
}
},
- "node_modules/hast-util-from-html": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-1.0.2.tgz",
- "integrity": "sha512-LhrTA2gfCbLOGJq2u/asp4kwuG0y6NhWTXiPKP+n0qNukKy7hc10whqqCFfyvIA1Q5U5d0sp9HhNim9gglEH4A==",
+ "node_modules/hast-util-raw/node_modules/unist-util-visit-parents": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz",
+ "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==",
+ "license": "MIT",
"dependencies": {
- "@types/hast": "^2.0.0",
- "hast-util-from-parse5": "^7.0.0",
- "parse5": "^7.0.0",
- "vfile": "^5.0.0",
- "vfile-message": "^3.0.0"
+ "@types/unist": "^3.0.0",
+ "unist-util-is": "^6.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
}
},
- "node_modules/hast-util-from-html-isomorphic": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/hast-util-from-html-isomorphic/-/hast-util-from-html-isomorphic-1.0.0.tgz",
- "integrity": "sha512-Yu480AKeOEN/+l5LA674a+7BmIvtDj24GvOt7MtQWuhzUwlaaRWdEPXAh3Qm5vhuthpAipFb2vTetKXWOjmTvw==",
+ "node_modules/hast-util-raw/node_modules/vfile": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz",
+ "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==",
+ "license": "MIT",
"dependencies": {
- "@types/hast": "^2.0.0",
- "hast-util-from-dom": "^4.0.0",
- "hast-util-from-html": "^1.0.0",
- "unist-util-remove-position": "^4.0.0"
+ "@types/unist": "^3.0.0",
+ "vfile-message": "^4.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
}
},
- "node_modules/hast-util-from-parse5": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-7.1.2.tgz",
- "integrity": "sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw==",
+ "node_modules/hast-util-raw/node_modules/vfile-location": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz",
+ "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==",
+ "license": "MIT",
"dependencies": {
- "@types/hast": "^2.0.0",
- "@types/unist": "^2.0.0",
- "hastscript": "^7.0.0",
- "property-information": "^6.0.0",
- "vfile": "^5.0.0",
- "vfile-location": "^4.0.0",
- "web-namespaces": "^2.0.0"
+ "@types/unist": "^3.0.0",
+ "vfile": "^6.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
}
},
- "node_modules/hast-util-is-element": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-2.1.3.tgz",
- "integrity": "sha512-O1bKah6mhgEq2WtVMk+Ta5K7pPMqsBBlmzysLdcwKVrqzZQ0CHqUPiIVspNhAG1rvxpvJjtGee17XfauZYKqVA==",
+ "node_modules/hast-util-raw/node_modules/vfile-message": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz",
+ "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==",
+ "license": "MIT",
"dependencies": {
- "@types/hast": "^2.0.0",
- "@types/unist": "^2.0.0"
+ "@types/unist": "^3.0.0",
+ "unist-util-stringify-position": "^4.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
}
},
- "node_modules/hast-util-parse-selector": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-3.1.1.tgz",
- "integrity": "sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==",
+ "node_modules/hast-util-to-parse5": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz",
+ "integrity": "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==",
+ "license": "MIT",
"dependencies": {
- "@types/hast": "^2.0.0"
+ "@types/hast": "^3.0.0",
+ "comma-separated-tokens": "^2.0.0",
+ "devlop": "^1.0.0",
+ "property-information": "^6.0.0",
+ "space-separated-tokens": "^2.0.0",
+ "web-namespaces": "^2.0.0",
+ "zwitch": "^2.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
}
},
+ "node_modules/hast-util-to-parse5/node_modules/@types/hast": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz",
+ "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
"node_modules/hast-util-to-text": {
"version": "3.1.2",
- "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-3.1.2.tgz",
- "integrity": "sha512-tcllLfp23dJJ+ju5wCCZHVpzsQQ43+moJbqVX3jNWPB7z/KFC4FyZD6R7y94cHL6MQ33YtMZL8Z0aIXXI4XFTw==",
+ "license": "MIT",
"dependencies": {
"@types/hast": "^2.0.0",
"@types/unist": "^2.0.0",
@@ -9463,8 +10711,7 @@
},
"node_modules/hast-util-whitespace": {
"version": "2.0.1",
- "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz",
- "integrity": "sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==",
+ "license": "MIT",
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
@@ -9472,8 +10719,7 @@
},
"node_modules/hastscript": {
"version": "7.2.0",
- "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-7.2.0.tgz",
- "integrity": "sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==",
+ "license": "MIT",
"dependencies": {
"@types/hast": "^2.0.0",
"comma-separated-tokens": "^2.0.0",
@@ -9488,29 +10734,28 @@
},
"node_modules/heap": {
"version": "0.2.7",
- "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz",
- "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg=="
+ "license": "MIT"
},
"node_modules/hermes-estree": {
"version": "0.12.0",
- "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.12.0.tgz",
- "integrity": "sha512-+e8xR6SCen0wyAKrMT3UD0ZCCLymKhRgjEB5sS28rKiFir/fXgLoeRilRUssFCILmGHb+OvHDUlhxs0+IEyvQw==",
- "license": "MIT"
+ "license": "MIT",
+ "optional": true,
+ "peer": true
},
"node_modules/hermes-parser": {
"version": "0.12.0",
- "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.12.0.tgz",
- "integrity": "sha512-d4PHnwq6SnDLhYl3LHNHvOg7nQ6rcI7QVil418REYksv0Mh3cEkHDcuhGxNQ3vgnLSLl4QSvDrFCwQNYdpWlzw==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"hermes-estree": "0.12.0"
}
},
"node_modules/hermes-profile-transformer": {
"version": "0.0.6",
- "resolved": "https://registry.npmjs.org/hermes-profile-transformer/-/hermes-profile-transformer-0.0.6.tgz",
- "integrity": "sha512-cnN7bQUm65UWOy6cbGcCcZ3rpwW8Q/j4OP5aWRhEry4Z2t2aR1cjrbp0BS+KiBN0smvP1caBgAuxutvyvJILzQ==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"source-map": "^0.7.3"
},
@@ -9520,30 +10765,59 @@
},
"node_modules/hermes-profile-transformer/node_modules/source-map": {
"version": "0.7.4",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
- "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==",
"license": "BSD-3-Clause",
+ "optional": true,
+ "peer": true,
"engines": {
"node": ">= 8"
}
},
+ "node_modules/highlight.js": {
+ "version": "10.7.3",
+ "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz",
+ "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/highlightjs-lean": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/highlightjs-lean/-/highlightjs-lean-1.2.0.tgz",
+ "integrity": "sha512-GH4tsvbzzZVZiHfrZ7FyaSecnY1ba54XSZB19Iz7VG0N+YYeOPLf2vi0v7Sds+/shaTtRqqxK5Oss9f4wro+uQ==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/highlightjs-vue": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/highlightjs-vue/-/highlightjs-vue-1.0.0.tgz",
+ "integrity": "sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==",
+ "license": "CC0-1.0"
+ },
+ "node_modules/hmac-drbg": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
+ "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "hash.js": "^1.0.3",
+ "minimalistic-assert": "^1.0.0",
+ "minimalistic-crypto-utils": "^1.0.1"
+ }
+ },
"node_modules/hoist-non-react-statics": {
"version": "3.3.2",
- "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
- "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==",
+ "license": "BSD-3-Clause",
"dependencies": {
"react-is": "^16.7.0"
}
},
"node_modules/hoist-non-react-statics/node_modules/react-is": {
"version": "16.13.1",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
- "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
+ "license": "MIT"
},
"node_modules/html-entities": {
"version": "2.4.0",
- "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz",
- "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==",
"dev": true,
"funding": [
{
@@ -9554,20 +10828,30 @@
"type": "patreon",
"url": "https://patreon.com/mdevils"
}
- ]
+ ],
+ "license": "MIT"
},
"node_modules/html-parse-stringify": {
"version": "3.0.1",
- "resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz",
- "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==",
+ "license": "MIT",
"dependencies": {
"void-elements": "3.1.0"
}
},
+ "node_modules/html-void-elements": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz",
+ "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
"node_modules/htmlparser2": {
- "version": "8.0.2",
- "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz",
- "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==",
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz",
+ "integrity": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==",
"funding": [
"https://github.com/fb55/htmlparser2?sponsor=1",
{
@@ -9575,23 +10859,33 @@
"url": "https://github.com/sponsors/fb55"
}
],
+ "license": "MIT",
"dependencies": {
"domelementtype": "^2.3.0",
"domhandler": "^5.0.3",
- "domutils": "^3.0.1",
- "entities": "^4.4.0"
+ "domutils": "^3.2.1",
+ "entities": "^6.0.0"
+ }
+ },
+ "node_modules/htmlparser2/node_modules/entities": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz",
+ "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
}
},
"node_modules/http-cache-semantics": {
"version": "4.1.1",
- "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz",
- "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==",
"license": "BSD-2-Clause"
},
"node_modules/http-errors": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
- "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
+ "license": "MIT",
"dependencies": {
"depd": "2.0.0",
"inherits": "2.0.4",
@@ -9603,10 +10897,23 @@
"node": ">= 0.8"
}
},
+ "node_modules/http-signature": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.4.0.tgz",
+ "integrity": "sha512-G5akfn7eKbpDN+8nPS/cb57YeA1jLTVxjpCj7tmm3QKPdyDy7T+qSC40e9ptydSWvkwjSXw1VbkpyEm39ukeAg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "assert-plus": "^1.0.0",
+ "jsprim": "^2.0.2",
+ "sshpk": "^1.18.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
"node_modules/http2-wrapper": {
"version": "2.2.1",
- "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz",
- "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==",
"license": "MIT",
"dependencies": {
"quick-lru": "^5.1.1",
@@ -9616,19 +10923,33 @@
"node": ">=10.19.0"
}
},
+ "node_modules/https-browserify": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
+ "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/human-signals": {
"version": "2.1.0",
- "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
- "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
"license": "Apache-2.0",
+ "optional": true,
+ "peer": true,
"engines": {
"node": ">=10.17.0"
}
},
+ "node_modules/hyperdyperid": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz",
+ "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.18"
+ }
+ },
"node_modules/i18next": {
"version": "23.10.1",
- "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.10.1.tgz",
- "integrity": "sha512-NDiIzFbcs3O9PXpfhkjyf7WdqFn5Vq6mhzhtkXzj51aOcNuPNcTwuYNuXCpHsanZGHlHKL35G7huoFeVic1hng==",
"funding": [
{
"type": "individual",
@@ -9643,23 +10964,22 @@
"url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project"
}
],
+ "license": "MIT",
"dependencies": {
"@babel/runtime": "^7.23.2"
}
},
"node_modules/i18next-http-backend": {
"version": "2.5.0",
- "resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-2.5.0.tgz",
- "integrity": "sha512-Z/aQsGZk1gSxt2/DztXk92DuDD20J+rNudT7ZCdTrNOiK8uQppfvdjq9+DFQfpAnFPn3VZS+KQIr1S/W1KxhpQ==",
+ "license": "MIT",
"dependencies": {
"cross-fetch": "4.0.0"
}
},
"node_modules/i18next-scanner": {
"version": "4.4.0",
- "resolved": "https://registry.npmjs.org/i18next-scanner/-/i18next-scanner-4.4.0.tgz",
- "integrity": "sha512-bgnVEfoFHLVxfXNQtsFFzexB/5kwgDZZkZ6+AnCmyaFKEQQbtMkgPgLHlMZ0deIIEG6KN/tYAus5ZJzng2Ac9g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"acorn": "^8.0.4",
"acorn-jsx": "^5.3.1",
@@ -9690,16 +11010,14 @@
},
"node_modules/i18next-scanner-typescript": {
"version": "1.2.0",
- "resolved": "https://registry.npmjs.org/i18next-scanner-typescript/-/i18next-scanner-typescript-1.2.0.tgz",
- "integrity": "sha512-Q9VFw8LygB8cW9/ixVf6DHkrP8CD0hRvJcxpaFVGbx9HU84yYWO7PmPfEc9kMFMVjR8HtRiP2U0i8Vinb/wsww==",
+ "license": "MIT",
"dependencies": {
"typescript": "^5.3.2"
}
},
"node_modules/i18next-scanner-typescript/node_modules/typescript": {
"version": "5.4.3",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.3.tgz",
- "integrity": "sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg==",
+ "license": "Apache-2.0",
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
@@ -9708,95 +11026,21 @@
"node": ">=14.17"
}
},
- "node_modules/i18next-scanner/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/i18next-scanner/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/i18next-scanner/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/i18next-scanner/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/i18next-scanner/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/i18next-scanner/node_modules/parse5": {
"version": "6.0.1",
- "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz",
- "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==",
- "dev": true
- },
- "node_modules/i18next-scanner/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"
- }
+ "license": "MIT"
},
"node_modules/i18next-scanner/node_modules/through2": {
"version": "4.0.2",
- "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz",
- "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"readable-stream": "3"
}
},
"node_modules/iconv-lite": {
"version": "0.4.24",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
- "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
"license": "MIT",
"dependencies": {
"safer-buffer": ">= 2.1.2 < 3"
@@ -9807,9 +11051,8 @@
},
"node_modules/icss-utils": {
"version": "5.1.0",
- "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz",
- "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==",
"dev": true,
+ "license": "ISC",
"engines": {
"node": "^10 || ^12 || >= 14"
},
@@ -9819,8 +11062,7 @@
},
"node_modules/ieee754": {
"version": "1.2.1",
- "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
- "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+ "devOptional": true,
"funding": [
{
"type": "github",
@@ -9834,19 +11076,19 @@
"type": "consulting",
"url": "https://feross.org/support"
}
- ]
+ ],
+ "license": "BSD-3-Clause"
},
"node_modules/ignore-by-default": {
"version": "1.0.1",
- "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
- "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==",
- "dev": true
+ "dev": true,
+ "license": "ISC"
},
"node_modules/image-size": {
"version": "1.2.1",
- "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.2.1.tgz",
- "integrity": "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"queue": "6.0.2"
},
@@ -9859,8 +11101,7 @@
},
"node_modules/immer": {
"version": "9.0.21",
- "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz",
- "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==",
+ "license": "MIT",
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/immer"
@@ -9868,8 +11109,7 @@
},
"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==",
+ "license": "MIT",
"dependencies": {
"parent-module": "^1.0.0",
"resolve-from": "^4.0.0"
@@ -9881,18 +11121,40 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/import-meta-resolve": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz",
+ "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
"node_modules/imurmurhash": {
"version": "0.1.4",
- "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"engines": {
"node": ">=0.8.19"
}
},
+ "node_modules/indent-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"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==",
+ "license": "ISC",
+ "optional": true,
+ "peer": true,
"dependencies": {
"once": "^1.3.0",
"wrappy": "1"
@@ -9900,19 +11162,26 @@
},
"node_modules/inherits": {
"version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ "license": "ISC"
+ },
+ "node_modules/ini": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz",
+ "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
},
"node_modules/inline-style-parser": {
"version": "0.1.1",
- "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz",
- "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q=="
+ "license": "MIT"
},
"node_modules/internal-slot": {
"version": "1.0.7",
- "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz",
- "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"es-errors": "^1.3.0",
"hasown": "^2.0.0",
@@ -9924,30 +11193,52 @@
},
"node_modules/invariant": {
"version": "2.2.4",
- "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
- "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"loose-envify": "^1.0.0"
}
},
"node_modules/ip-anonymize": {
"version": "0.1.0",
- "resolved": "https://registry.npmjs.org/ip-anonymize/-/ip-anonymize-0.1.0.tgz",
- "integrity": "sha512-cZJu+N5JKKFGMK0eEQWNaQMn2EhCysciVM6eotCJwfqotj16BTfVchKsJCH6mQAT9N0GC7oWRcsZ6Lb8dDiwTA=="
+ "license": "MIT"
},
"node_modules/ipaddr.js": {
"version": "1.9.1",
- "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
- "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
+ "license": "MIT",
"engines": {
"node": ">= 0.10"
}
},
+ "node_modules/is-alphabetical": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz",
+ "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-alphanumerical": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz",
+ "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==",
+ "license": "MIT",
+ "dependencies": {
+ "is-alphabetical": "^1.0.0",
+ "is-decimal": "^1.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
"node_modules/is-arguments": {
"version": "1.1.1",
- "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz",
- "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"call-bind": "^1.0.2",
"has-tostringtag": "^1.0.0"
@@ -9961,9 +11252,8 @@
},
"node_modules/is-array-buffer": {
"version": "3.0.4",
- "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz",
- "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"call-bind": "^1.0.2",
"get-intrinsic": "^1.2.1"
@@ -9977,14 +11267,12 @@
},
"node_modules/is-arrayish": {
"version": "0.2.1",
- "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
- "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="
+ "license": "MIT"
},
"node_modules/is-bigint": {
"version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
- "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"has-bigints": "^1.0.1"
},
@@ -9994,8 +11282,8 @@
},
"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,
+ "license": "MIT",
"dependencies": {
"binary-extensions": "^2.0.0"
},
@@ -10005,9 +11293,8 @@
},
"node_modules/is-boolean-object": {
"version": "1.1.2",
- "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
- "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"call-bind": "^1.0.2",
"has-tostringtag": "^1.0.0"
@@ -10021,8 +11308,6 @@
},
"node_modules/is-buffer": {
"version": "2.0.5",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz",
- "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==",
"funding": [
{
"type": "github",
@@ -10037,6 +11322,7 @@
"url": "https://feross.org/support"
}
],
+ "license": "MIT",
"engines": {
"node": ">=4"
}
@@ -10046,6 +11332,7 @@
"resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
"integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">= 0.4"
},
@@ -10055,8 +11342,7 @@
},
"node_modules/is-core-module": {
"version": "2.13.1",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz",
- "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==",
+ "license": "MIT",
"dependencies": {
"hasown": "^2.0.0"
},
@@ -10066,9 +11352,8 @@
},
"node_modules/is-date-object": {
"version": "1.0.5",
- "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
- "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"has-tostringtag": "^1.0.0"
},
@@ -10079,36 +11364,65 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/is-decimal": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz",
+ "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
"node_modules/is-directory": {
"version": "0.3.1",
- "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz",
- "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"engines": {
"node": ">=0.10.0"
}
},
"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,
+ "license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/is-fullwidth-code-point": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
- "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"engines": {
"node": ">=4"
}
},
+ "node_modules/is-generator-function": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz",
+ "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "get-proto": "^1.0.0",
+ "has-tostringtag": "^1.0.2",
+ "safe-regex-test": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/is-glob": {
"version": "4.0.3",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
- "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
"is-extglob": "^2.1.1"
},
@@ -10116,37 +11430,78 @@
"node": ">=0.10.0"
}
},
+ "node_modules/is-hexadecimal": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz",
+ "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-installed-globally": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz",
+ "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "global-dirs": "^3.0.0",
+ "is-path-inside": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/is-interactive": {
"version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz",
- "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"engines": {
"node": ">=8"
}
},
"node_modules/is-map": {
"version": "2.0.2",
- "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz",
- "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==",
"dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-nan": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz",
+ "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.0",
+ "define-properties": "^1.1.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-negated-glob": {
"version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz",
- "integrity": "sha512-czXVVn/QEmgvej1f50BZ648vUI+em0xqMq2Sn+QncCLN4zj1UAxlT+kw/6ggQTOaZPd1HqKQGEqbpQVtJucWug==",
"dev": true,
+ "license": "MIT",
"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==",
+ "devOptional": true,
"license": "MIT",
"engines": {
"node": ">=0.12.0"
@@ -10154,9 +11509,8 @@
},
"node_modules/is-number-object": {
"version": "1.0.7",
- "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
- "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"has-tostringtag": "^1.0.0"
},
@@ -10167,10 +11521,19 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "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,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/is-plain-obj": {
"version": "4.1.0",
- "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
- "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
+ "license": "MIT",
"engines": {
"node": ">=12"
},
@@ -10180,8 +11543,8 @@
},
"node_modules/is-plain-object": {
"version": "2.0.4",
- "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
- "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "devOptional": true,
+ "license": "MIT",
"dependencies": {
"isobject": "^3.0.1"
},
@@ -10190,13 +11553,16 @@
}
},
"node_modules/is-regex": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
- "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz",
+ "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2",
- "has-tostringtag": "^1.0.0"
+ "call-bound": "^1.0.2",
+ "gopd": "^1.2.0",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
},
"engines": {
"node": ">= 0.4"
@@ -10207,18 +11573,16 @@
},
"node_modules/is-set": {
"version": "2.0.2",
- "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz",
- "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==",
"dev": true,
+ "license": "MIT",
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-shared-array-buffer": {
"version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz",
- "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"call-bind": "^1.0.2"
},
@@ -10228,8 +11592,7 @@
},
"node_modules/is-stream": {
"version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
- "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "devOptional": true,
"license": "MIT",
"engines": {
"node": ">=8"
@@ -10240,9 +11603,8 @@
},
"node_modules/is-string": {
"version": "1.0.7",
- "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
- "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"has-tostringtag": "^1.0.0"
},
@@ -10255,9 +11617,8 @@
},
"node_modules/is-symbol": {
"version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
- "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"has-symbols": "^1.0.2"
},
@@ -10268,10 +11629,31 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/is-typed-array": {
+ "version": "1.1.15",
+ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz",
+ "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "which-typed-array": "^1.1.16"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-typedarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
+ "license": "MIT"
+ },
"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==",
+ "devOptional": true,
"license": "MIT",
"engines": {
"node": ">=10"
@@ -10282,27 +11664,24 @@
},
"node_modules/is-valid-glob": {
"version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz",
- "integrity": "sha512-AhiROmoEFDSsjx8hW+5sGwgKVIORcXnrlAx/R0ZSeaPw70Vw0CqkGBBhHGL58Uox2eXnU1AnvXJl1XlyedO5bA==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/is-weakmap": {
"version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz",
- "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==",
"dev": true,
+ "license": "MIT",
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-weakset": {
"version": "2.0.2",
- "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz",
- "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"call-bind": "^1.0.2",
"get-intrinsic": "^1.1.1"
@@ -10313,36 +11692,51 @@
},
"node_modules/is-wsl": {
"version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
- "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"engines": {
"node": ">=4"
}
},
"node_modules/isarray": {
"version": "2.0.5",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
- "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/isexe": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
+ "license": "ISC"
},
"node_modules/isobject": {
"version": "3.0.1",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
+ "devOptional": true,
+ "license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
+ "node_modules/isomorphic-timers-promises": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/isomorphic-timers-promises/-/isomorphic-timers-promises-1.0.1.tgz",
+ "integrity": "sha512-u4sej9B1LPSxTGKB/HiuzvEQnXH0ECYkSVQU39koSwmFAxhlEAFl9RdTvLv4TOTQUgBS5O3O5fwUxk6byBZ+IQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==",
+ "license": "MIT"
+ },
"node_modules/jest-environment-node": {
"version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz",
- "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@jest/environment": "^29.7.0",
"@jest/fake-timers": "^29.7.0",
@@ -10357,17 +11751,18 @@
},
"node_modules/jest-get-type": {
"version": "29.6.3",
- "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz",
- "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/jest-message-util": {
"version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz",
- "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/code-frame": "^7.12.13",
"@jest/types": "^29.6.3",
@@ -10383,63 +11778,11 @@
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/jest-message-util/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==",
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/jest-message-util/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "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/jest-message-util/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==",
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/jest-message-util/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=="
- },
- "node_modules/jest-message-util/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==",
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/jest-message-util/node_modules/pretty-format": {
"version": "29.7.0",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
- "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@jest/schemas": "^29.6.3",
"ansi-styles": "^5.0.0",
@@ -10451,8 +11794,9 @@
},
"node_modules/jest-message-util/node_modules/pretty-format/node_modules/ansi-styles": {
"version": "5.2.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
- "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"engines": {
"node": ">=10"
},
@@ -10460,21 +11804,11 @@
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
- "node_modules/jest-message-util/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==",
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/jest-mock": {
"version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz",
- "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@jest/types": "^29.6.3",
"@types/node": "*",
@@ -10486,17 +11820,18 @@
},
"node_modules/jest-regex-util": {
"version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz",
- "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"engines": {
"node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
}
},
"node_modules/jest-util": {
"version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz",
- "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@jest/types": "^29.6.3",
"@types/node": "*",
@@ -10509,75 +11844,11 @@
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/jest-util/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==",
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/jest-util/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "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/jest-util/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==",
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/jest-util/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=="
- },
- "node_modules/jest-util/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==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/jest-util/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==",
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/jest-validate": {
"version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz",
- "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@jest/types": "^29.6.3",
"camelcase": "^6.2.0",
@@ -10590,69 +11861,11 @@
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/jest-validate/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==",
- "license": "MIT",
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/jest-validate/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "license": "MIT",
- "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/jest-validate/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==",
- "license": "MIT",
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/jest-validate/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==",
- "license": "MIT"
- },
- "node_modules/jest-validate/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==",
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/jest-validate/node_modules/pretty-format": {
"version": "29.7.0",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
- "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@jest/schemas": "^29.6.3",
"ansi-styles": "^5.0.0",
@@ -10664,9 +11877,9 @@
},
"node_modules/jest-validate/node_modules/pretty-format/node_modules/ansi-styles": {
"version": "5.2.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
- "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"engines": {
"node": ">=10"
},
@@ -10674,22 +11887,11 @@
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
- "node_modules/jest-validate/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==",
- "license": "MIT",
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/jest-worker": {
"version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
- "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
+ "devOptional": true,
+ "license": "MIT",
+ "peer": true,
"dependencies": {
"@types/node": "*",
"merge-stream": "^2.0.0",
@@ -10701,16 +11903,18 @@
},
"node_modules/jest-worker/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==",
+ "devOptional": true,
+ "license": "MIT",
+ "peer": true,
"engines": {
"node": ">=8"
}
},
"node_modules/jest-worker/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==",
+ "devOptional": true,
+ "license": "MIT",
+ "peer": true,
"dependencies": {
"has-flag": "^4.0.0"
},
@@ -10723,8 +11927,7 @@
},
"node_modules/joi": {
"version": "17.13.3",
- "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz",
- "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==",
+ "devOptional": true,
"license": "BSD-3-Clause",
"dependencies": {
"@hapi/hoek": "^9.3.0",
@@ -10736,14 +11939,13 @@
},
"node_modules/js-tokens": {
"version": "4.0.0",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
- "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+ "license": "MIT"
},
"node_modules/js-yaml": {
"version": "3.14.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
- "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"argparse": "^1.0.7",
"esprima": "^4.0.0"
@@ -10752,117 +11954,68 @@
"js-yaml": "bin/js-yaml.js"
}
},
+ "node_modules/jsbn": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+ "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==",
+ "license": "MIT"
+ },
"node_modules/jsc-android": {
"version": "250231.0.0",
- "resolved": "https://registry.npmjs.org/jsc-android/-/jsc-android-250231.0.0.tgz",
- "integrity": "sha512-rS46PvsjYmdmuz1OAWXY/1kCYG7pnf1TBqeTiOJr1iDz7s5DLxxC9n/ZMknLDxzYzNVfI7R95MH10emSSG1Wuw=="
+ "license": "BSD-2-Clause",
+ "optional": true,
+ "peer": true
},
"node_modules/jsc-safe-url": {
"version": "0.2.4",
- "resolved": "https://registry.npmjs.org/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz",
- "integrity": "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==",
- "license": "0BSD"
- },
- "node_modules/jscodeshift": {
- "version": "0.14.0",
- "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.14.0.tgz",
- "integrity": "sha512-7eCC1knD7bLUPuSCwXsMZUH51O8jIcoVyKtI6P0XM0IVzlGjckPy3FIwQlorzbN0Sg79oK+RlohN32Mqf/lrYA==",
- "dependencies": {
- "@babel/core": "^7.13.16",
- "@babel/parser": "^7.13.16",
- "@babel/plugin-proposal-class-properties": "^7.13.0",
- "@babel/plugin-proposal-nullish-coalescing-operator": "^7.13.8",
- "@babel/plugin-proposal-optional-chaining": "^7.13.12",
- "@babel/plugin-transform-modules-commonjs": "^7.13.8",
- "@babel/preset-flow": "^7.13.13",
- "@babel/preset-typescript": "^7.13.0",
- "@babel/register": "^7.13.16",
- "babel-core": "^7.0.0-bridge.0",
- "chalk": "^4.1.2",
- "flow-parser": "0.*",
- "graceful-fs": "^4.2.4",
- "micromatch": "^4.0.4",
- "neo-async": "^2.5.0",
- "node-dir": "^0.1.17",
- "recast": "^0.21.0",
- "temp": "^0.8.4",
- "write-file-atomic": "^2.3.0"
- },
- "bin": {
- "jscodeshift": "bin/jscodeshift.js"
- },
- "peerDependencies": {
- "@babel/preset-env": "^7.1.6"
- }
- },
- "node_modules/jscodeshift/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==",
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/jscodeshift/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "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/jscodeshift/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==",
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/jscodeshift/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=="
+ "license": "0BSD",
+ "optional": true,
+ "peer": true
},
- "node_modules/jscodeshift/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==",
+ "node_modules/jschardet": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/jschardet/-/jschardet-3.1.3.tgz",
+ "integrity": "sha512-Q1PKVMK/uu+yjdlobgWIYkUOCR1SqUmW9m/eUJNNj4zI2N12i25v8fYpVf+zCakQeaTdBdhnZTFbVIAVZIVVOg==",
+ "license": "LGPL-2.1+",
"engines": {
- "node": ">=8"
+ "node": ">=0.1.90"
}
- },
- "node_modules/jscodeshift/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==",
+ },
+ "node_modules/jscodeshift": {
+ "version": "0.14.0",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
- "has-flag": "^4.0.0"
+ "@babel/core": "^7.13.16",
+ "@babel/parser": "^7.13.16",
+ "@babel/plugin-proposal-class-properties": "^7.13.0",
+ "@babel/plugin-proposal-nullish-coalescing-operator": "^7.13.8",
+ "@babel/plugin-proposal-optional-chaining": "^7.13.12",
+ "@babel/plugin-transform-modules-commonjs": "^7.13.8",
+ "@babel/preset-flow": "^7.13.13",
+ "@babel/preset-typescript": "^7.13.0",
+ "@babel/register": "^7.13.16",
+ "babel-core": "^7.0.0-bridge.0",
+ "chalk": "^4.1.2",
+ "flow-parser": "0.*",
+ "graceful-fs": "^4.2.4",
+ "micromatch": "^4.0.4",
+ "neo-async": "^2.5.0",
+ "node-dir": "^0.1.17",
+ "recast": "^0.21.0",
+ "temp": "^0.8.4",
+ "write-file-atomic": "^2.3.0"
},
- "engines": {
- "node": ">=8"
+ "bin": {
+ "jscodeshift": "bin/jscodeshift.js"
+ },
+ "peerDependencies": {
+ "@babel/preset-env": "^7.1.6"
}
},
"node_modules/jsesc": {
"version": "3.0.2",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz",
- "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==",
"license": "MIT",
"bin": {
"jsesc": "bin/jsesc"
@@ -10873,31 +12026,37 @@
},
"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==",
"license": "MIT"
},
"node_modules/json-parse-better-errors": {
"version": "1.0.2",
- "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
- "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
- "license": "MIT"
+ "license": "MIT",
+ "optional": true,
+ "peer": true
},
"node_modules/json-parse-even-better-errors": {
"version": "2.3.1",
- "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
- "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="
+ "license": "MIT"
+ },
+ "node_modules/json-schema": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
+ "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
+ "license": "(AFL-2.1 OR BSD-3-Clause)"
},
"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
+ "license": "MIT"
+ },
+ "node_modules/json-stringify-safe": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+ "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
+ "license": "ISC"
},
"node_modules/json5": {
"version": "2.2.3",
- "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
- "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "license": "MIT",
"bin": {
"json5": "lib/cli.js"
},
@@ -10907,17 +12066,31 @@
},
"node_modules/jsonfile": {
"version": "4.0.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
- "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"optionalDependencies": {
"graceful-fs": "^4.1.6"
}
},
+ "node_modules/jsprim": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz",
+ "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==",
+ "dev": true,
+ "engines": [
+ "node >=0.6.0"
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "assert-plus": "1.0.0",
+ "extsprintf": "1.3.0",
+ "json-schema": "0.4.0",
+ "verror": "1.10.0"
+ }
+ },
"node_modules/katex": {
"version": "0.16.21",
- "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.21.tgz",
- "integrity": "sha512-XvqR7FgOHtWupfMiigNzmh+MgUVmDGU2kXZm899ZkPfcuoPuFxyHmXsgATDpFZDAXCI8tvinaVcDo8PIIJSo4A==",
"funding": [
"https://opencollective.com/katex",
"https://github.com/sponsors/katex"
@@ -10932,16 +12105,13 @@
},
"node_modules/katex/node_modules/commander": {
"version": "8.3.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz",
- "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==",
+ "license": "MIT",
"engines": {
"node": ">= 12"
}
},
"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==",
"license": "MIT",
"dependencies": {
"json-buffer": "3.0.1"
@@ -10949,31 +12119,39 @@
},
"node_modules/kind-of": {
"version": "6.0.3",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
- "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+ "devOptional": true,
+ "license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/klayjs": {
"version": "0.4.1",
- "resolved": "https://registry.npmjs.org/klayjs/-/klayjs-0.4.1.tgz",
- "integrity": "sha512-WUNxuO7O79TEkxCj6OIaK5TJBkaWaR/IKNTakgV9PwDn+mrr63MLHed34AcE2yTaDntgO6l0zGFIzhcoTeroTA=="
+ "license": "EPL-1.0"
},
"node_modules/kleur": {
"version": "3.0.3",
- "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
- "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"engines": {
"node": ">=6"
}
},
+ "node_modules/lazy-ass": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz",
+ "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "> 0.8"
+ }
+ },
"node_modules/lead": {
"version": "4.0.0",
- "resolved": "https://registry.npmjs.org/lead/-/lead-4.0.0.tgz",
- "integrity": "sha512-DpMa59o5uGUWWjruMp71e6knmwKU3jRBBn1kjuLWN9EeIOxNeSAwvHf03WIl8g/ZMR2oSQC9ej3yeLBwdDc/pg==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=10.13.0"
}
@@ -11013,33 +12191,36 @@
"vscode-languageserver-protocol": "^3.17.2"
}
},
- "node_modules/lean4/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==",
+ "node_modules/lean4/node_modules/@leanprover/infoview": {
+ "version": "0.4.5",
+ "resolved": "https://registry.npmjs.org/@leanprover/infoview/-/infoview-0.4.5.tgz",
+ "integrity": "sha512-CK1Etux2e9lBg/eiDb0laj5Y9VAcPquLd9wdWU/GOiL1XAT64MVsGvhUsHr+LbZq6bxQn8JIgSfKgnHGTKwigg==",
+ "license": "Apache-2.0",
"dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
+ "@leanprover/infoview-api": "~0.2.1",
+ "@vscode/codicons": "^0.0.32",
+ "es-module-shims": "^1.6.2",
+ "marked": "^4.2.2",
+ "react-fast-compare": "^3.2.0",
+ "tachyons": "^4.12.0",
+ "vscode-languageserver-protocol": "^3.17.2"
}
},
"node_modules/lean4/node_modules/mobx": {
"version": "5.15.7",
"resolved": "https://registry.npmjs.org/mobx/-/mobx-5.15.7.tgz",
"integrity": "sha512-wyM3FghTkhmC+hQjyPGGFdpehrcX1KOXsDuERhfK2YbJemkUhEB+6wzEN639T21onxlfYBmriA1PFnvxTUhcKw==",
+ "license": "MIT",
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/mobx"
}
},
"node_modules/lean4/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"
- },
+ "version": "7.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
+ "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
+ "license": "ISC",
"bin": {
"semver": "bin/semver.js"
},
@@ -11047,405 +12228,328 @@
"node": ">=10"
}
},
- "node_modules/lean4/node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
- },
- "node_modules/lean4web": {
- "version": "0.1.0",
- "resolved": "git+ssh://git@github.com/hhu-adam/lean4web.git#414d9e62638a392fca278761b4c61a1d2e138bc7",
- "integrity": "sha512-IjgFSBMY5+fCacLh9VSQJXWQ8i0M9rzY9xJrNEYURP4rqwDZoLmJrFcDKamtZTc9Gzy1zWKTWkM8tujtoKQpJQ==",
+ "node_modules/lean4monaco": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/lean4monaco/-/lean4monaco-1.1.3.tgz",
+ "integrity": "sha512-dkYVQZd47JvTiwndiITYuAU8ID3yIvmXQV9R37lt3Z5kbw0Gl7kxe47K/SZqvlomowujXttWVxN12fmUkK/3YA==",
+ "license": "Apache-2.0",
"dependencies": {
- "@emotion/react": "^11.11.1",
- "@emotion/styled": "^11.11.0",
- "@fontsource/roboto": "^4.5.8",
- "@fontsource/roboto-mono": "^4.5.8",
- "@fortawesome/fontawesome-svg-core": "^6.2.0",
- "@fortawesome/free-solid-svg-icons": "^6.2.0",
- "@fortawesome/react-fontawesome": "^0.2.0",
- "@leanprover/infoview": "^0.4.4",
- "@mui/material": "^5.13.7",
- "@vitejs/plugin-react-swc": "^3.4.0",
- "express": "^4.18.2",
- "file-saver": "^2.0.5",
- "ip-anonymize": "^0.1.0",
- "lean4": "https://gitpkg.now.sh/leanprover/vscode-lean4/vscode-lean4?8d0cc34dcfa00da8b4a48394ba1fb3a600e3f985",
- "mobx": "^6.6.2",
- "moment-timezone": "^0.5.39",
- "monaco-editor": "^0.34.1",
- "monaco-editor-textmate": "^4.0.0",
- "monaco-languageclient": "^4.0.1",
- "monaco-textmate": "^3.0.1",
- "nocache": "^3.0.4",
- "onigasm": "^2.2.5",
- "path-browserify": "^1.0.1",
- "react": "^18.2.0",
- "react-dom": "^18.2.0",
- "react-popper": "^2.3.0",
- "react-split": "^2.0.14",
- "stream-http": "^3.2.0",
- "vite": "^4.5.0",
- "vscode-ws-jsonrpc": "^2.0.0",
- "ws": "^8.9.0"
- }
- },
- "node_modules/lean4web/node_modules/@esbuild/android-arm": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz",
- "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==",
- "cpu": [
- "arm"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/lean4web/node_modules/@esbuild/android-arm64": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz",
- "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==",
- "cpu": [
- "arm64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/lean4web/node_modules/@esbuild/android-x64": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz",
- "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==",
- "cpu": [
- "x64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/lean4web/node_modules/@esbuild/darwin-arm64": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz",
- "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==",
- "cpu": [
- "arm64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/lean4web/node_modules/@esbuild/darwin-x64": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz",
- "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==",
- "cpu": [
- "x64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/lean4web/node_modules/@esbuild/freebsd-arm64": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz",
- "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==",
- "cpu": [
- "arm64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/lean4web/node_modules/@esbuild/freebsd-x64": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz",
- "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==",
- "cpu": [
- "x64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/lean4web/node_modules/@esbuild/linux-arm": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz",
- "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==",
- "cpu": [
- "arm"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
+ "@leanprover/infoview": "~0.8.5",
+ "@leanprover/infoview-api": "~0.7.0",
+ "@leanprover/unicode-input": "~0.1.4",
+ "@leanprover/unicode-input-component": "~0.1.4",
+ "concurrently": "^8.2.2",
+ "import-meta-resolve": "^4.1.0",
+ "memfs": "^4.9.3",
+ "monaco-editor-wrapper": "^5.3.1",
+ "semver": "^7.6.2",
+ "zod": "^3.22.4"
}
},
- "node_modules/lean4web/node_modules/@esbuild/linux-arm64": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz",
- "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==",
- "cpu": [
- "arm64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
+ "node_modules/lean4monaco/node_modules/@leanprover/infoview-api": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/@leanprover/infoview-api/-/infoview-api-0.7.0.tgz",
+ "integrity": "sha512-2h6c+VWxu9MV1CKternaoFzoaXI6qQAOAzsGiqw/10e3koG5BpX8Rz7N6uQntB1/Y45HQQo6r2ztoODjttjkZg==",
+ "license": "Apache-2.0"
},
- "node_modules/lean4web/node_modules/@esbuild/linux-ia32": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz",
- "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==",
- "cpu": [
- "ia32"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
+ "node_modules/lean4monaco/node_modules/brace-expansion": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
}
},
- "node_modules/lean4web/node_modules/@esbuild/linux-loong64": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz",
- "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==",
- "cpu": [
- "loong64"
- ],
+ "node_modules/lean4monaco/node_modules/concurrently": {
+ "version": "8.2.2",
+ "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz",
+ "integrity": "sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==",
"license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
+ "dependencies": {
+ "chalk": "^4.1.2",
+ "date-fns": "^2.30.0",
+ "lodash": "^4.17.21",
+ "rxjs": "^7.8.1",
+ "shell-quote": "^1.8.1",
+ "spawn-command": "0.0.2",
+ "supports-color": "^8.1.1",
+ "tree-kill": "^1.2.2",
+ "yargs": "^17.7.2"
+ },
+ "bin": {
+ "conc": "dist/bin/concurrently.js",
+ "concurrently": "dist/bin/concurrently.js"
+ },
"engines": {
- "node": ">=12"
+ "node": "^14.13.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/open-cli-tools/concurrently?sponsor=1"
}
},
- "node_modules/lean4web/node_modules/@esbuild/linux-mips64el": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz",
- "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==",
- "cpu": [
- "mips64el"
- ],
+ "node_modules/lean4monaco/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==",
"license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
"engines": {
- "node": ">=12"
+ "node": ">=8"
}
},
- "node_modules/lean4web/node_modules/@esbuild/linux-ppc64": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz",
- "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==",
- "cpu": [
- "ppc64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
+ "node_modules/lean4monaco/node_modules/minimatch": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+ "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
"engines": {
- "node": ">=12"
+ "node": ">=10"
}
},
- "node_modules/lean4web/node_modules/@esbuild/linux-riscv64": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz",
- "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==",
- "cpu": [
- "riscv64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
+ "node_modules/lean4monaco/node_modules/monaco-editor": {
+ "name": "@codingame/monaco-vscode-editor-api",
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-editor-api/-/monaco-vscode-editor-api-8.0.4.tgz",
+ "integrity": "sha512-rKUdFRsnzTV1dj6FL/MD+cBIUAGv9aJNz8bTx4BA5sDK3lDWuifhdCBvk4WZEj6glfXe3sEfGXKy1Vp5btDOJQ==",
+ "license": "MIT",
+ "dependencies": {
+ "vscode": "npm:@codingame/monaco-vscode-api@8.0.4"
+ }
+ },
+ "node_modules/lean4monaco/node_modules/monaco-editor-wrapper": {
+ "version": "5.5.3",
+ "resolved": "https://registry.npmjs.org/monaco-editor-wrapper/-/monaco-editor-wrapper-5.5.3.tgz",
+ "integrity": "sha512-ceC+HnpUw/WehfH9uL7Y5j1m/46hQFcS/Z1VYpiFl+pieNf4/JfOWrzLEDqnxOK/qrPJ2fR6JB78mfZNLtPeQQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@codingame/monaco-vscode-configuration-service-override": "~8.0.4",
+ "@codingame/monaco-vscode-editor-service-override": "~8.0.4",
+ "@codingame/monaco-vscode-language-pack-cs": "~8.0.4",
+ "@codingame/monaco-vscode-language-pack-de": "~8.0.4",
+ "@codingame/monaco-vscode-language-pack-es": "~8.0.4",
+ "@codingame/monaco-vscode-language-pack-fr": "~8.0.4",
+ "@codingame/monaco-vscode-language-pack-it": "~8.0.4",
+ "@codingame/monaco-vscode-language-pack-ja": "~8.0.4",
+ "@codingame/monaco-vscode-language-pack-ko": "~8.0.4",
+ "@codingame/monaco-vscode-language-pack-pl": "~8.0.4",
+ "@codingame/monaco-vscode-language-pack-pt-br": "~8.0.4",
+ "@codingame/monaco-vscode-language-pack-qps-ploc": "~8.0.4",
+ "@codingame/monaco-vscode-language-pack-ru": "~8.0.4",
+ "@codingame/monaco-vscode-language-pack-tr": "~8.0.4",
+ "@codingame/monaco-vscode-language-pack-zh-hans": "~8.0.4",
+ "@codingame/monaco-vscode-language-pack-zh-hant": "~8.0.4",
+ "@codingame/monaco-vscode-monarch-service-override": "~8.0.4",
+ "@codingame/monaco-vscode-textmate-service-override": "~8.0.4",
+ "@codingame/monaco-vscode-theme-defaults-default-extension": "~8.0.4",
+ "@codingame/monaco-vscode-theme-service-override": "~8.0.4",
+ "monaco-editor": "npm:@codingame/monaco-vscode-editor-api@~8.0.4",
+ "vscode": "npm:@codingame/monaco-vscode-api@~8.0.4",
+ "vscode-languageclient": "~9.0.1",
+ "vscode-languageserver-protocol": "~3.17.5",
+ "vscode-ws-jsonrpc": "~3.3.2"
+ },
+ "peerDependencies": {
+ "monaco-editor": "npm:@codingame/monaco-vscode-editor-api@~8.0.4",
+ "monaco-languageclient": "~8.8.3",
+ "vscode": "npm:@codingame/monaco-vscode-api@~8.0.4"
+ },
+ "peerDependenciesMeta": {
+ "monaco-editor": {
+ "optional": false
+ },
+ "monaco-languageclient": {
+ "optional": false
+ },
+ "vscode": {
+ "optional": false
+ }
}
},
- "node_modules/lean4web/node_modules/@esbuild/linux-s390x": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz",
- "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==",
- "cpu": [
- "s390x"
- ],
+ "node_modules/lean4monaco/node_modules/monaco-languageclient": {
+ "version": "8.8.3",
+ "resolved": "https://registry.npmjs.org/monaco-languageclient/-/monaco-languageclient-8.8.3.tgz",
+ "integrity": "sha512-F/ETX2EuUgFnwxNXCrlPOplrINTPMzNvMJBKdl6ZzHnCucnaoJQt9nmqWZmNG4DU2cyaUwTMrcNODOgqQ+So4w==",
"license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
+ "peer": true,
+ "dependencies": {
+ "@codingame/monaco-vscode-extensions-service-override": "~8.0.4",
+ "@codingame/monaco-vscode-languages-service-override": "~8.0.4",
+ "@codingame/monaco-vscode-localization-service-override": "~8.0.4",
+ "@codingame/monaco-vscode-model-service-override": "~8.0.4",
+ "monaco-editor": "npm:@codingame/monaco-vscode-editor-api@~8.0.4",
+ "vscode": "npm:@codingame/monaco-vscode-api@~8.0.4",
+ "vscode-languageclient": "~9.0.1"
+ },
"engines": {
- "node": ">=12"
+ "node": ">=16.11.0",
+ "npm": ">=9.0.0"
+ },
+ "peerDependencies": {
+ "monaco-editor": "npm:@codingame/monaco-vscode-editor-api@~8.0.4",
+ "vscode": "npm:@codingame/monaco-vscode-api@~8.0.4"
+ },
+ "peerDependenciesMeta": {
+ "monaco-editor": {
+ "optional": false
+ },
+ "vscode": {
+ "optional": false
+ }
}
},
- "node_modules/lean4web/node_modules/@esbuild/linux-x64": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz",
- "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==",
- "cpu": [
- "x64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
+ "node_modules/lean4monaco/node_modules/semver": {
+ "version": "7.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
+ "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
"engines": {
- "node": ">=12"
+ "node": ">=10"
}
},
- "node_modules/lean4web/node_modules/@esbuild/netbsd-x64": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz",
- "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==",
- "cpu": [
- "x64"
- ],
+ "node_modules/lean4monaco/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==",
"license": "MIT",
- "optional": true,
- "os": [
- "netbsd"
- ],
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
"engines": {
- "node": ">=12"
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
}
},
- "node_modules/lean4web/node_modules/@esbuild/openbsd-x64": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz",
- "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==",
- "cpu": [
- "x64"
- ],
+ "node_modules/lean4monaco/node_modules/vscode": {
+ "name": "@codingame/monaco-vscode-api",
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-api/-/monaco-vscode-api-8.0.4.tgz",
+ "integrity": "sha512-qZ+HwIijDvzwwWscMA73y9ARu5zUaENOdzi0jQftJP9j2k96cRghsaCV25OgnmpZ/1BemjB4HhHCcr71Gq+GPQ==",
"license": "MIT",
- "optional": true,
- "os": [
- "openbsd"
- ],
- "engines": {
- "node": ">=12"
+ "dependencies": {
+ "@codingame/monaco-vscode-base-service-override": "8.0.4",
+ "@codingame/monaco-vscode-environment-service-override": "8.0.4",
+ "@codingame/monaco-vscode-extensions-service-override": "8.0.4",
+ "@codingame/monaco-vscode-files-service-override": "8.0.4",
+ "@codingame/monaco-vscode-host-service-override": "8.0.4",
+ "@codingame/monaco-vscode-layout-service-override": "8.0.4",
+ "@codingame/monaco-vscode-quickaccess-service-override": "8.0.4",
+ "@vscode/iconv-lite-umd": "0.7.0",
+ "jschardet": "3.1.3"
}
},
- "node_modules/lean4web/node_modules/@esbuild/sunos-x64": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz",
- "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==",
- "cpu": [
- "x64"
- ],
+ "node_modules/lean4monaco/node_modules/vscode-jsonrpc": {
+ "version": "8.2.1",
+ "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.1.tgz",
+ "integrity": "sha512-kdjOSJ2lLIn7r1rtrMbbNCHjyMPfRnowdKjBQ+mGq6NAW5QY2bEZC/khaC5OR8svbbjvLEaIXkOq45e2X9BIbQ==",
"license": "MIT",
- "optional": true,
- "os": [
- "sunos"
- ],
"engines": {
- "node": ">=12"
+ "node": ">=14.0.0"
}
},
- "node_modules/lean4web/node_modules/@esbuild/win32-arm64": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz",
- "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==",
- "cpu": [
- "arm64"
- ],
+ "node_modules/lean4monaco/node_modules/vscode-languageclient": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-9.0.1.tgz",
+ "integrity": "sha512-JZiimVdvimEuHh5olxhxkht09m3JzUGwggb5eRUkzzJhZ2KjCN0nh55VfiED9oez9DyF8/fz1g1iBV3h+0Z2EA==",
"license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
+ "dependencies": {
+ "minimatch": "^5.1.0",
+ "semver": "^7.3.7",
+ "vscode-languageserver-protocol": "3.17.5"
+ },
"engines": {
- "node": ">=12"
+ "vscode": "^1.82.0"
}
},
- "node_modules/lean4web/node_modules/@esbuild/win32-ia32": {
- "version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz",
- "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==",
- "cpu": [
- "ia32"
- ],
+ "node_modules/lean4monaco/node_modules/vscode-ws-jsonrpc": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/vscode-ws-jsonrpc/-/vscode-ws-jsonrpc-3.3.2.tgz",
+ "integrity": "sha512-jxGHxAuow67sNRkkS2svsW00ZACX+Zrbury9Au2A22px6sg4pe858Nnnwvtg0Pm4D0L/W9Yzn7N7X3R/RIMxsQ==",
"license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
+ "dependencies": {
+ "vscode-jsonrpc": "~8.2.1"
+ },
"engines": {
- "node": ">=12"
+ "node": ">=16.11.0",
+ "npm": ">=8.0.0"
+ }
+ },
+ "node_modules/lean4web": {
+ "version": "0.1.0",
+ "resolved": "git+ssh://git@github.com/hhu-adam/lean4web.git#414d9e62638a392fca278761b4c61a1d2e138bc7",
+ "integrity": "sha512-IjgFSBMY5+fCacLh9VSQJXWQ8i0M9rzY9xJrNEYURP4rqwDZoLmJrFcDKamtZTc9Gzy1zWKTWkM8tujtoKQpJQ==",
+ "dependencies": {
+ "@emotion/react": "^11.11.1",
+ "@emotion/styled": "^11.11.0",
+ "@fontsource/roboto": "^4.5.8",
+ "@fontsource/roboto-mono": "^4.5.8",
+ "@fortawesome/fontawesome-svg-core": "^6.2.0",
+ "@fortawesome/free-solid-svg-icons": "^6.2.0",
+ "@fortawesome/react-fontawesome": "^0.2.0",
+ "@leanprover/infoview": "^0.4.4",
+ "@mui/material": "^5.13.7",
+ "@vitejs/plugin-react-swc": "^3.4.0",
+ "express": "^4.18.2",
+ "file-saver": "^2.0.5",
+ "ip-anonymize": "^0.1.0",
+ "lean4": "https://gitpkg.now.sh/leanprover/vscode-lean4/vscode-lean4?8d0cc34dcfa00da8b4a48394ba1fb3a600e3f985",
+ "mobx": "^6.6.2",
+ "moment-timezone": "^0.5.39",
+ "monaco-editor": "^0.34.1",
+ "monaco-editor-textmate": "^4.0.0",
+ "monaco-languageclient": "^4.0.1",
+ "monaco-textmate": "^3.0.1",
+ "nocache": "^3.0.4",
+ "onigasm": "^2.2.5",
+ "path-browserify": "^1.0.1",
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0",
+ "react-popper": "^2.3.0",
+ "react-split": "^2.0.14",
+ "stream-http": "^3.2.0",
+ "vite": "^4.5.0",
+ "vscode-ws-jsonrpc": "^2.0.0",
+ "ws": "^8.9.0"
}
},
- "node_modules/lean4web/node_modules/@esbuild/win32-x64": {
+ "node_modules/lean4web/node_modules/@esbuild/linux-x64": {
"version": "0.18.20",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz",
- "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==",
"cpu": [
"x64"
],
"license": "MIT",
"optional": true,
"os": [
- "win32"
+ "linux"
],
"engines": {
"node": ">=12"
}
},
+ "node_modules/lean4web/node_modules/@leanprover/infoview": {
+ "version": "0.4.5",
+ "resolved": "https://registry.npmjs.org/@leanprover/infoview/-/infoview-0.4.5.tgz",
+ "integrity": "sha512-CK1Etux2e9lBg/eiDb0laj5Y9VAcPquLd9wdWU/GOiL1XAT64MVsGvhUsHr+LbZq6bxQn8JIgSfKgnHGTKwigg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@leanprover/infoview-api": "~0.2.1",
+ "@vscode/codicons": "^0.0.32",
+ "es-module-shims": "^1.6.2",
+ "marked": "^4.2.2",
+ "react-fast-compare": "^3.2.0",
+ "tachyons": "^4.12.0",
+ "vscode-languageserver-protocol": "^3.17.2"
+ }
+ },
"node_modules/lean4web/node_modules/esbuild": {
"version": "0.18.20",
- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz",
- "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==",
"hasInstallScript": true,
"license": "MIT",
"bin": {
@@ -11479,10 +12583,24 @@
"@esbuild/win32-x64": "0.18.20"
}
},
+ "node_modules/lean4web/node_modules/rollup": {
+ "version": "3.29.5",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.5.tgz",
+ "integrity": "sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==",
+ "license": "MIT",
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=14.18.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
"node_modules/lean4web/node_modules/vite": {
"version": "4.5.14",
- "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.14.tgz",
- "integrity": "sha512-+v57oAaoYNnO3hIu5Z/tJRZjq5aHM2zDve9YZ8HngVHbhk66RStobhb1sqPMIPEleV6cNKYK4eGrAbE9Ulbl2g==",
"license": "MIT",
"dependencies": {
"esbuild": "^0.18.10",
@@ -11534,25 +12652,105 @@
}
}
},
- "node_modules/leven": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
- "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
+ "node_modules/leven": {
+ "version": "3.1.0",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/lines-and-columns": {
+ "version": "1.2.4",
+ "license": "MIT"
+ },
+ "node_modules/listr2": {
+ "version": "3.14.0",
+ "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz",
+ "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cli-truncate": "^2.1.0",
+ "colorette": "^2.0.16",
+ "log-update": "^4.0.0",
+ "p-map": "^4.0.0",
+ "rfdc": "^1.3.0",
+ "rxjs": "^7.5.1",
+ "through": "^2.3.8",
+ "wrap-ansi": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "enquirer": ">= 2.3.0 < 3"
+ },
+ "peerDependenciesMeta": {
+ "enquirer": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/listr2/node_modules/colorette": {
+ "version": "2.0.20",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz",
+ "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/listr2/node_modules/p-map": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
+ "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
+ "dev": true,
"license": "MIT",
+ "dependencies": {
+ "aggregate-error": "^3.0.0"
+ },
"engines": {
- "node": ">=6"
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/lines-and-columns": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
- "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="
+ "node_modules/lit": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/lit/-/lit-3.3.0.tgz",
+ "integrity": "sha512-DGVsqsOIHBww2DqnuZzW7QsuCdahp50ojuDaBPC7jUDRpYoH0z7kHBBYZewRzer75FwtrkmkKk7iOAwSaWdBmw==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@lit/reactive-element": "^2.1.0",
+ "lit-element": "^4.2.0",
+ "lit-html": "^3.3.0"
+ }
+ },
+ "node_modules/lit-element": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.2.0.tgz",
+ "integrity": "sha512-MGrXJVAI5x+Bfth/pU9Kst1iWID6GHDLEzFEnyULB/sFiRLgkd8NPK/PeeXxktA3T6EIIaq8U3KcbTU5XFcP2Q==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@lit-labs/ssr-dom-shim": "^1.2.0",
+ "@lit/reactive-element": "^2.1.0",
+ "lit-html": "^3.3.0"
+ }
+ },
+ "node_modules/lit-html": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.3.0.tgz",
+ "integrity": "sha512-RHoswrFAxY2d8Cf2mm4OZ1DgzCoBKUKSPvA1fhtSELxUERq2aQQ2h05pO9j81gS1o7RIRJ+CePLogfyahwmynw==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@types/trusted-types": "^2.0.2"
+ }
},
"node_modules/loader-runner": {
"version": "4.3.0",
- "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz",
- "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==",
"dev": true,
+ "license": "MIT",
"peer": true,
"engines": {
"node": ">=6.11.5"
@@ -11560,9 +12758,8 @@
},
"node_modules/loader-utils": {
"version": "2.0.4",
- "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
- "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"big.js": "^5.2.2",
"emojis-list": "^3.0.0",
@@ -11574,8 +12771,8 @@
},
"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==",
+ "devOptional": true,
+ "license": "MIT",
"dependencies": {
"p-locate": "^5.0.0"
},
@@ -11588,24 +12785,30 @@
},
"node_modules/lodash": {
"version": "4.17.21",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
- "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+ "license": "MIT"
},
"node_modules/lodash.debounce": {
"version": "4.0.8",
- "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
- "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="
+ "license": "MIT",
+ "optional": true,
+ "peer": true
},
- "node_modules/lodash.throttle": {
+ "node_modules/lodash.once": {
"version": "4.1.1",
- "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz",
- "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==",
+ "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
+ "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==",
+ "dev": true,
"license": "MIT"
},
+ "node_modules/lodash.throttle": {
+ "version": "4.1.1",
+ "license": "MIT",
+ "optional": true,
+ "peer": 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==",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"chalk": "^4.1.0",
@@ -11618,10 +12821,30 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/log-symbols/node_modules/ansi-styles": {
+ "node_modules/log-update": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz",
+ "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-escapes": "^4.3.0",
+ "cli-cursor": "^3.1.0",
+ "slice-ansi": "^4.0.0",
+ "wrap-ansi": "^6.2.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/log-update/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,
"license": "MIT",
"dependencies": {
"color-convert": "^2.0.1"
@@ -11633,26 +12856,21 @@
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
- "node_modules/log-symbols/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "node_modules/log-update/node_modules/astral-regex": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
+ "dev": true,
"license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
+ "node": ">=8"
}
},
- "node_modules/log-symbols/node_modules/color-convert": {
+ "node_modules/log-update/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,
"license": "MIT",
"dependencies": {
"color-name": "~1.1.4"
@@ -11661,28 +12879,64 @@
"node": ">=7.0.0"
}
},
- "node_modules/log-symbols/node_modules/color-name": {
+ "node_modules/log-update/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,
"license": "MIT"
},
- "node_modules/log-symbols/node_modules/has-flag": {
+ "node_modules/log-update/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,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/log-update/node_modules/slice-ansi": {
"version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
+ "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "astral-regex": "^2.0.0",
+ "is-fullwidth-code-point": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/slice-ansi?sponsor=1"
+ }
+ },
+ "node_modules/log-update/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,
"license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
"engines": {
"node": ">=8"
}
},
- "node_modules/log-symbols/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==",
+ "node_modules/log-update/node_modules/wrap-ansi": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+ "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "has-flag": "^4.0.0"
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
},
"engines": {
"node": ">=8"
@@ -11690,9 +12944,9 @@
},
"node_modules/logkitty": {
"version": "0.7.1",
- "resolved": "https://registry.npmjs.org/logkitty/-/logkitty-0.7.1.tgz",
- "integrity": "sha512-/3ER20CTTbahrCrpYfPn7Xavv9diBROZpoXGVZDWMw4b/X4uuUwAC0ki85tgsdMRONURyIJbcOvS94QsUBYPbQ==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"ansi-fragments": "^0.2.1",
"dayjs": "^1.8.15",
@@ -11704,9 +12958,9 @@
},
"node_modules/logkitty/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==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"color-convert": "^2.0.1"
},
@@ -11719,18 +12973,18 @@
},
"node_modules/logkitty/node_modules/camelcase": {
"version": "5.3.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
- "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"engines": {
"node": ">=6"
}
},
"node_modules/logkitty/node_modules/cliui": {
"version": "6.0.0",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
- "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
"license": "ISC",
+ "optional": true,
+ "peer": true,
"dependencies": {
"string-width": "^4.2.0",
"strip-ansi": "^6.0.0",
@@ -11739,9 +12993,9 @@
},
"node_modules/logkitty/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==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"color-name": "~1.1.4"
},
@@ -11751,15 +13005,15 @@
},
"node_modules/logkitty/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==",
- "license": "MIT"
+ "license": "MIT",
+ "optional": true,
+ "peer": true
},
"node_modules/logkitty/node_modules/find-up": {
"version": "4.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
- "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"locate-path": "^5.0.0",
"path-exists": "^4.0.0"
@@ -11770,9 +13024,9 @@
},
"node_modules/logkitty/node_modules/locate-path": {
"version": "5.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
- "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"p-locate": "^4.1.0"
},
@@ -11782,9 +13036,9 @@
},
"node_modules/logkitty/node_modules/p-limit": {
"version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"p-try": "^2.0.0"
},
@@ -11797,9 +13051,9 @@
},
"node_modules/logkitty/node_modules/p-locate": {
"version": "4.1.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
- "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"p-limit": "^2.2.0"
},
@@ -11809,9 +13063,9 @@
},
"node_modules/logkitty/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==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"ansi-regex": "^5.0.1"
},
@@ -11821,9 +13075,9 @@
},
"node_modules/logkitty/node_modules/wrap-ansi": {
"version": "6.2.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
- "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"ansi-styles": "^4.0.0",
"string-width": "^4.1.0",
@@ -11835,15 +13089,15 @@
},
"node_modules/logkitty/node_modules/y18n": {
"version": "4.0.3",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
- "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
- "license": "ISC"
+ "license": "ISC",
+ "optional": true,
+ "peer": true
},
"node_modules/logkitty/node_modules/yargs": {
"version": "15.4.1",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
- "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"cliui": "^6.0.0",
"decamelize": "^1.2.0",
@@ -11863,9 +13117,9 @@
},
"node_modules/logkitty/node_modules/yargs-parser": {
"version": "18.1.3",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
- "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
"license": "ISC",
+ "optional": true,
+ "peer": true,
"dependencies": {
"camelcase": "^5.0.0",
"decamelize": "^1.2.0"
@@ -11876,14 +13130,11 @@
},
"node_modules/long-timeout": {
"version": "0.1.1",
- "resolved": "https://registry.npmjs.org/long-timeout/-/long-timeout-0.1.1.tgz",
- "integrity": "sha512-BFRuQUqc7x2NWxfJBCyUrN8iYUYznzL9JROmRz1gZ6KlOIgmoD+njPVbb+VNn2nGMKggMsK79iUNErillsrx7w==",
"license": "MIT"
},
"node_modules/longest-streak": {
"version": "3.1.0",
- "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz",
- "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==",
+ "license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/wooorm"
@@ -11891,8 +13142,7 @@
},
"node_modules/loose-envify": {
"version": "1.4.0",
- "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
- "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "license": "MIT",
"dependencies": {
"js-tokens": "^3.0.0 || ^4.0.0"
},
@@ -11902,16 +13152,14 @@
},
"node_modules/lower-case": {
"version": "2.0.2",
- "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz",
- "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
"tslib": "^2.0.3"
}
},
"node_modules/lowercase-keys": {
"version": "3.0.0",
- "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz",
- "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==",
"license": "MIT",
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
@@ -11920,18 +13168,29 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/lowlight": {
+ "version": "1.20.0",
+ "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.20.0.tgz",
+ "integrity": "sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==",
+ "license": "MIT",
+ "dependencies": {
+ "fault": "^1.0.0",
+ "highlight.js": "~10.7.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
"node_modules/lru-cache": {
"version": "5.1.1",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
- "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "license": "ISC",
"dependencies": {
"yallist": "^3.0.2"
}
},
"node_modules/luxon": {
"version": "3.6.1",
- "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.6.1.tgz",
- "integrity": "sha512-tJLxrKJhO2ukZ5z0gyjY1zPh3Rh88Ej9P7jNrZiHMUXHae1yvI2imgOZtL1TO8TW6biMMKfTtAOoEJANgtWBMQ==",
"license": "MIT",
"engines": {
"node": ">=12"
@@ -11939,17 +13198,27 @@
},
"node_modules/lz-string": {
"version": "1.5.0",
- "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz",
- "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==",
"dev": true,
+ "license": "MIT",
"bin": {
"lz-string": "bin/bin.js"
}
},
+ "node_modules/magic-string": {
+ "version": "0.30.17",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz",
+ "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.0"
+ }
+ },
"node_modules/make-dir": {
"version": "2.1.0",
- "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
- "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"pify": "^4.0.1",
"semver": "^5.6.0"
@@ -11960,25 +13229,25 @@
},
"node_modules/make-dir/node_modules/semver": {
"version": "5.7.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
- "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "license": "ISC",
+ "optional": true,
+ "peer": true,
"bin": {
"semver": "bin/semver"
}
},
"node_modules/makeerror": {
"version": "1.0.12",
- "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz",
- "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==",
"license": "BSD-3-Clause",
+ "optional": true,
+ "peer": true,
"dependencies": {
"tmpl": "1.0.5"
}
},
"node_modules/markdown-table": {
"version": "3.0.3",
- "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz",
- "integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==",
+ "license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/wooorm"
@@ -11986,8 +13255,7 @@
},
"node_modules/marked": {
"version": "4.3.0",
- "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz",
- "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==",
+ "license": "MIT",
"bin": {
"marked": "bin/marked.js"
},
@@ -11997,17 +13265,38 @@
},
"node_modules/math-intrinsics": {
"version": "1.1.0",
- "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
- "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
"license": "MIT",
"engines": {
"node": ">= 0.4"
}
},
+ "node_modules/mathjax-full": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/mathjax-full/-/mathjax-full-3.2.2.tgz",
+ "integrity": "sha512-+LfG9Fik+OuI8SLwsiR02IVdjcnRCy5MufYLi0C3TdMT56L/pjB0alMVGgoWJF8pN9Rc7FESycZB9BMNWIid5w==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "esm": "^3.2.25",
+ "mhchemparser": "^4.1.0",
+ "mj-context-menu": "^0.6.1",
+ "speech-rule-engine": "^4.0.6"
+ }
+ },
+ "node_modules/md5.js": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
+ "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "hash-base": "^3.0.0",
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.1.2"
+ }
+ },
"node_modules/mdast-util-definitions": {
"version": "5.1.2",
- "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz",
- "integrity": "sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==",
+ "license": "MIT",
"dependencies": {
"@types/mdast": "^3.0.0",
"@types/unist": "^2.0.0",
@@ -12020,8 +13309,7 @@
},
"node_modules/mdast-util-find-and-replace": {
"version": "2.2.2",
- "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.2.tgz",
- "integrity": "sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==",
+ "license": "MIT",
"dependencies": {
"@types/mdast": "^3.0.0",
"escape-string-regexp": "^5.0.0",
@@ -12035,8 +13323,7 @@
},
"node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": {
"version": "5.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
- "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
+ "license": "MIT",
"engines": {
"node": ">=12"
},
@@ -12046,8 +13333,7 @@
},
"node_modules/mdast-util-from-markdown": {
"version": "1.3.1",
- "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz",
- "integrity": "sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==",
+ "license": "MIT",
"dependencies": {
"@types/mdast": "^3.0.0",
"@types/unist": "^2.0.0",
@@ -12069,8 +13355,7 @@
},
"node_modules/mdast-util-gfm": {
"version": "2.0.2",
- "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-2.0.2.tgz",
- "integrity": "sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==",
+ "license": "MIT",
"dependencies": {
"mdast-util-from-markdown": "^1.0.0",
"mdast-util-gfm-autolink-literal": "^1.0.0",
@@ -12087,8 +13372,7 @@
},
"node_modules/mdast-util-gfm-autolink-literal": {
"version": "1.0.3",
- "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.3.tgz",
- "integrity": "sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==",
+ "license": "MIT",
"dependencies": {
"@types/mdast": "^3.0.0",
"ccount": "^2.0.0",
@@ -12102,8 +13386,7 @@
},
"node_modules/mdast-util-gfm-footnote": {
"version": "1.0.2",
- "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.2.tgz",
- "integrity": "sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==",
+ "license": "MIT",
"dependencies": {
"@types/mdast": "^3.0.0",
"mdast-util-to-markdown": "^1.3.0",
@@ -12116,8 +13399,7 @@
},
"node_modules/mdast-util-gfm-strikethrough": {
"version": "1.0.3",
- "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.3.tgz",
- "integrity": "sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==",
+ "license": "MIT",
"dependencies": {
"@types/mdast": "^3.0.0",
"mdast-util-to-markdown": "^1.3.0"
@@ -12129,8 +13411,7 @@
},
"node_modules/mdast-util-gfm-table": {
"version": "1.0.7",
- "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.7.tgz",
- "integrity": "sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==",
+ "license": "MIT",
"dependencies": {
"@types/mdast": "^3.0.0",
"markdown-table": "^3.0.0",
@@ -12144,8 +13425,7 @@
},
"node_modules/mdast-util-gfm-task-list-item": {
"version": "1.0.2",
- "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.2.tgz",
- "integrity": "sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==",
+ "license": "MIT",
"dependencies": {
"@types/mdast": "^3.0.0",
"mdast-util-to-markdown": "^1.3.0"
@@ -12157,8 +13437,7 @@
},
"node_modules/mdast-util-math": {
"version": "2.0.2",
- "resolved": "https://registry.npmjs.org/mdast-util-math/-/mdast-util-math-2.0.2.tgz",
- "integrity": "sha512-8gmkKVp9v6+Tgjtq6SYx9kGPpTf6FVYRa53/DLh479aldR9AyP48qeVOgNZ5X7QUK7nOy4yw7vg6mbiGcs9jWQ==",
+ "license": "MIT",
"dependencies": {
"@types/mdast": "^3.0.0",
"longest-streak": "^3.0.0",
@@ -12171,8 +13450,7 @@
},
"node_modules/mdast-util-phrasing": {
"version": "3.0.1",
- "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz",
- "integrity": "sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==",
+ "license": "MIT",
"dependencies": {
"@types/mdast": "^3.0.0",
"unist-util-is": "^5.0.0"
@@ -12184,8 +13462,7 @@
},
"node_modules/mdast-util-to-hast": {
"version": "12.3.0",
- "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz",
- "integrity": "sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==",
+ "license": "MIT",
"dependencies": {
"@types/hast": "^2.0.0",
"@types/mdast": "^3.0.0",
@@ -12203,8 +13480,7 @@
},
"node_modules/mdast-util-to-markdown": {
"version": "1.5.0",
- "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz",
- "integrity": "sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==",
+ "license": "MIT",
"dependencies": {
"@types/mdast": "^3.0.0",
"@types/unist": "^2.0.0",
@@ -12222,8 +13498,7 @@
},
"node_modules/mdast-util-to-string": {
"version": "3.2.0",
- "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz",
- "integrity": "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==",
+ "license": "MIT",
"dependencies": {
"@types/mdast": "^3.0.0"
},
@@ -12234,22 +13509,38 @@
},
"node_modules/media-typer": {
"version": "0.3.0",
- "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
- "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
"license": "MIT",
"engines": {
"node": ">= 0.6"
}
},
+ "node_modules/memfs": {
+ "version": "4.17.2",
+ "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.17.2.tgz",
+ "integrity": "sha512-NgYhCOWgovOXSzvYgUW0LQ7Qy72rWQMGGFJDoWg4G30RHd3z77VbYdtJ4fembJXBy8pMIUA31XNAupobOQlwdg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@jsonjoy.com/json-pack": "^1.0.3",
+ "@jsonjoy.com/util": "^1.3.0",
+ "tree-dump": "^1.0.1",
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">= 4.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/streamich"
+ }
+ },
"node_modules/memoize-one": {
"version": "5.2.1",
- "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz",
- "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q=="
+ "license": "MIT",
+ "optional": true,
+ "peer": true
},
"node_modules/merge-descriptors": {
"version": "1.0.3",
- "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
- "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==",
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
@@ -12257,13 +13548,12 @@
},
"node_modules/merge-stream": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
- "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="
+ "devOptional": true,
+ "license": "MIT"
},
"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,
"license": "MIT",
"engines": {
"node": ">= 8"
@@ -12271,17 +13561,16 @@
},
"node_modules/methods": {
"version": "1.1.2",
- "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
- "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
+ "license": "MIT",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/metro": {
"version": "0.76.9",
- "resolved": "https://registry.npmjs.org/metro/-/metro-0.76.9.tgz",
- "integrity": "sha512-gcjcfs0l5qIPg0lc5P7pj0x7vPJ97tan+OnEjiYLbKjR1D7Oa78CE93YUPyymUPH6q7VzlzMm1UjT35waEkZUw==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/code-frame": "^7.0.0",
"@babel/core": "^7.20.0",
@@ -12340,9 +13629,9 @@
},
"node_modules/metro-babel-transformer": {
"version": "0.76.9",
- "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.76.9.tgz",
- "integrity": "sha512-dAnAmBqRdTwTPVn4W4JrowPolxD1MDbuU97u3MqtWZgVRvDpmr+Cqnn5oSxLQk3Uc+Zy3wkqVrB/zXNRlLDSAQ==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/core": "^7.20.0",
"hermes-parser": "0.12.0",
@@ -12354,9 +13643,9 @@
},
"node_modules/metro-cache": {
"version": "0.76.9",
- "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.76.9.tgz",
- "integrity": "sha512-W6QFEU5AJG1gH4Ltv8S2IvhmEhSDYnbPafyj5fGR3YLysdykj+olKv9B0V+YQXtcLGyY5CqpXLYUx595GdiKzA==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"metro-core": "0.76.9",
"rimraf": "^3.0.2"
@@ -12367,18 +13656,18 @@
},
"node_modules/metro-cache-key": {
"version": "0.76.9",
- "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.76.9.tgz",
- "integrity": "sha512-ugJuYBLngHVh1t2Jj+uP9pSCQl7enzVXkuh6+N3l0FETfqjgOaSHlcnIhMPn6yueGsjmkiIfxQU4fyFVXRtSTw==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"engines": {
"node": ">=16"
}
},
"node_modules/metro-config": {
"version": "0.76.9",
- "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.76.9.tgz",
- "integrity": "sha512-oYyJ16PY3rprsfoi80L+gDJhFJqsKI3Pob5LKQbJpvL+gGr8qfZe1eQzYp5Xxxk9DOHKBV1xD94NB8GdT/DA8Q==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"connect": "^3.6.5",
"cosmiconfig": "^5.0.5",
@@ -12394,9 +13683,9 @@
},
"node_modules/metro-config/node_modules/cosmiconfig": {
"version": "5.2.1",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz",
- "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"import-fresh": "^2.0.0",
"is-directory": "^0.3.1",
@@ -12409,9 +13698,9 @@
},
"node_modules/metro-config/node_modules/import-fresh": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz",
- "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"caller-path": "^2.0.0",
"resolve-from": "^3.0.0"
@@ -12422,9 +13711,9 @@
},
"node_modules/metro-config/node_modules/parse-json": {
"version": "4.0.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
- "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"error-ex": "^1.3.1",
"json-parse-better-errors": "^1.0.1"
@@ -12435,18 +13724,18 @@
},
"node_modules/metro-config/node_modules/resolve-from": {
"version": "3.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
- "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"engines": {
"node": ">=4"
}
},
"node_modules/metro-core": {
"version": "0.76.9",
- "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.76.9.tgz",
- "integrity": "sha512-DSeEr43Wrd5Q7ySfRzYzDwfV89g2OZTQDf1s3exOcLjE5fb7awoLOkA2h46ZzN8NcmbbM0cuJy6hOwF073/yRQ==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"lodash.throttle": "^4.1.1",
"metro-resolver": "0.76.9"
@@ -12457,9 +13746,9 @@
},
"node_modules/metro-file-map": {
"version": "0.76.9",
- "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.76.9.tgz",
- "integrity": "sha512-7vJd8kksMDTO/0fbf3081bTrlw8SLiploeDf+vkkf0OwlrtDUWPOikfebp+MpZB2S61kamKjCNRfRkgrbPfSwg==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"anymatch": "^3.0.3",
"debug": "^2.2.0",
@@ -12483,9 +13772,9 @@
},
"node_modules/metro-file-map/node_modules/@jest/types": {
"version": "27.5.1",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
- "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@types/istanbul-lib-coverage": "^2.0.0",
"@types/istanbul-reports": "^3.0.0",
@@ -12499,85 +13788,27 @@
},
"node_modules/metro-file-map/node_modules/@types/yargs": {
"version": "16.0.9",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz",
- "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@types/yargs-parser": "*"
}
},
- "node_modules/metro-file-map/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==",
- "license": "MIT",
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/metro-file-map/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "license": "MIT",
- "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/metro-file-map/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==",
- "license": "MIT",
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/metro-file-map/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==",
- "license": "MIT"
- },
"node_modules/metro-file-map/node_modules/debug": {
"version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"ms": "2.0.0"
}
},
- "node_modules/metro-file-map/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==",
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/metro-file-map/node_modules/jest-util": {
"version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz",
- "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@jest/types": "^27.5.1",
"@types/node": "*",
@@ -12592,27 +13823,15 @@
},
"node_modules/metro-file-map/node_modules/ms": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
- "license": "MIT"
- },
- "node_modules/metro-file-map/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==",
"license": "MIT",
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
+ "optional": true,
+ "peer": true
},
"node_modules/metro-inspector-proxy": {
"version": "0.76.9",
- "resolved": "https://registry.npmjs.org/metro-inspector-proxy/-/metro-inspector-proxy-0.76.9.tgz",
- "integrity": "sha512-idIiPkb8CYshc0WZmbzwmr4B1QwsQUbpDwBzHwxE1ni27FWKWhV9CD5p+qlXZHgfwJuMRfPN+tIaLSR8+vttYg==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"connect": "^3.6.5",
"debug": "^2.2.0",
@@ -12629,24 +13848,24 @@
},
"node_modules/metro-inspector-proxy/node_modules/debug": {
"version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"ms": "2.0.0"
}
},
"node_modules/metro-inspector-proxy/node_modules/ms": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
- "license": "MIT"
+ "license": "MIT",
+ "optional": true,
+ "peer": true
},
"node_modules/metro-inspector-proxy/node_modules/ws": {
"version": "7.5.10",
- "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz",
- "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"engines": {
"node": ">=8.3.0"
},
@@ -12665,9 +13884,9 @@
},
"node_modules/metro-minify-terser": {
"version": "0.76.9",
- "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.76.9.tgz",
- "integrity": "sha512-ju2nUXTKvh96vHPoGZH/INhSvRRKM14CbGAJXQ98+g8K5z1v3luYJ/7+dFQB202eVzJdTB2QMtBjI1jUUpooCg==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"terser": "^5.15.0"
},
@@ -12677,9 +13896,9 @@
},
"node_modules/metro-minify-uglify": {
"version": "0.76.9",
- "resolved": "https://registry.npmjs.org/metro-minify-uglify/-/metro-minify-uglify-0.76.9.tgz",
- "integrity": "sha512-MXRrM3lFo62FPISlPfTqC6n9HTEI3RJjDU5SvpE7sJFfJKLx02xXQEltsL/wzvEqK+DhRQ5DEYACTwf5W4Z3yA==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"uglify-es": "^3.1.9"
},
@@ -12689,9 +13908,9 @@
},
"node_modules/metro-react-native-babel-preset": {
"version": "0.76.9",
- "resolved": "https://registry.npmjs.org/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.76.9.tgz",
- "integrity": "sha512-eCBtW/UkJPDr6HlMgFEGF+964DZsUEF9RGeJdZLKWE7d/0nY3ABZ9ZAGxzu9efQ35EWRox5bDMXUGaOwUe5ikQ==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/core": "^7.20.0",
"@babel/plugin-proposal-async-generator-functions": "^7.0.0",
@@ -12742,18 +13961,18 @@
},
"node_modules/metro-react-native-babel-preset/node_modules/react-refresh": {
"version": "0.4.3",
- "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.4.3.tgz",
- "integrity": "sha512-Hwln1VNuGl/6bVwnd0Xdn1e84gT/8T9aYNL+HAKDArLCS7LWjwr7StE30IEYbIkx0Vi3vs+coQxe+SQDbGbbpA==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/metro-react-native-babel-transformer": {
"version": "0.76.9",
- "resolved": "https://registry.npmjs.org/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.76.9.tgz",
- "integrity": "sha512-xXzHcfngSIkbQj+U7i/anFkNL0q2QVarYSzr34CFkzKLa79Rp16B8ki7z9eVVqo9W3B4TBcTXl3BipgRoOoZSQ==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/core": "^7.20.0",
"babel-preset-fbjs": "^3.4.0",
@@ -12770,18 +13989,18 @@
},
"node_modules/metro-resolver": {
"version": "0.76.9",
- "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.76.9.tgz",
- "integrity": "sha512-s86ipNRas9vNR5lChzzSheF7HoaQEmzxBLzwFA6/2YcGmUCowcoyPAfs1yPh4cjMw9F1T4KlMLaiwniGE7HCyw==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"engines": {
"node": ">=16"
}
},
"node_modules/metro-runtime": {
"version": "0.76.9",
- "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.76.9.tgz",
- "integrity": "sha512-/5vezDpGUtA0Fv6cJg0+i6wB+QeBbvLeaw9cTSG7L76liP0b91f8vOcYzGaUbHI8pznJCCTerxRzpQ8e3/NcDw==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/runtime": "^7.0.0",
"react-refresh": "^0.4.0"
@@ -12792,18 +14011,18 @@
},
"node_modules/metro-runtime/node_modules/react-refresh": {
"version": "0.4.3",
- "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.4.3.tgz",
- "integrity": "sha512-Hwln1VNuGl/6bVwnd0Xdn1e84gT/8T9aYNL+HAKDArLCS7LWjwr7StE30IEYbIkx0Vi3vs+coQxe+SQDbGbbpA==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/metro-source-map": {
"version": "0.76.9",
- "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.76.9.tgz",
- "integrity": "sha512-q5qsMlu8EFvsT46wUUh+ao+efDsicT30zmaPATNhq+PcTawDbDgnMuUD+FT0bvxxnisU2PWl91RdzKfNc2qPQA==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/traverse": "^7.20.0",
"@babel/types": "^7.20.0",
@@ -12820,9 +14039,9 @@
},
"node_modules/metro-symbolicate": {
"version": "0.76.9",
- "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.76.9.tgz",
- "integrity": "sha512-Yyq6Ukj/IeWnGST09kRt0sBK8TwzGZWoU7YAcQlh14+AREH454Olx4wbFTpkkhUkV05CzNCvUuXQ0efFxhA1bw==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"invariant": "^2.2.4",
"metro-source-map": "0.76.9",
@@ -12840,9 +14059,9 @@
},
"node_modules/metro-transform-plugins": {
"version": "0.76.9",
- "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.76.9.tgz",
- "integrity": "sha512-YEQeNlOCt92I7S9A3xbrfaDfwfgcxz9PpD/1eeop3c4cO3z3Q3otYuxw0WJ/rUIW8pZfOm5XCehd+1NRbWlAaw==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/core": "^7.20.0",
"@babel/generator": "^7.20.0",
@@ -12856,9 +14075,9 @@
},
"node_modules/metro-transform-worker": {
"version": "0.76.9",
- "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.76.9.tgz",
- "integrity": "sha512-F69A0q0qFdJmP2Clqr6TpTSn4WTV9p5A28h5t9o+mB22ryXBZfUQ6BFBBW/6Wp2k/UtPH+oOsBfV9guiqm3d2Q==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/core": "^7.20.0",
"@babel/generator": "^7.20.0",
@@ -12878,90 +14097,32 @@
"node": ">=16"
}
},
- "node_modules/metro/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==",
- "license": "MIT",
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/metro/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "license": "MIT",
- "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/metro/node_modules/ci-info": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
- "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
- "license": "MIT"
- },
- "node_modules/metro/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==",
"license": "MIT",
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/metro/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==",
- "license": "MIT"
+ "optional": true,
+ "peer": true
},
"node_modules/metro/node_modules/debug": {
"version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"ms": "2.0.0"
}
},
- "node_modules/metro/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==",
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/metro/node_modules/ms": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
- "license": "MIT"
+ "license": "MIT",
+ "optional": true,
+ "peer": true
},
"node_modules/metro/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==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"ansi-regex": "^5.0.1"
},
@@ -12969,23 +14130,11 @@
"node": ">=8"
}
},
- "node_modules/metro/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==",
- "license": "MIT",
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/metro/node_modules/ws": {
"version": "7.5.10",
- "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz",
- "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"engines": {
"node": ">=8.3.0"
},
@@ -13002,10 +14151,14 @@
}
}
},
+ "node_modules/mhchemparser": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/mhchemparser/-/mhchemparser-4.2.1.tgz",
+ "integrity": "sha512-kYmyrCirqJf3zZ9t/0wGgRZ4/ZJw//VwaRVGA75C4nhE60vtnIzhl9J9ndkX/h6hxSN7pjg/cE0VxbnNM+bnDQ==",
+ "license": "Apache-2.0"
+ },
"node_modules/micromark": {
"version": "3.2.0",
- "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz",
- "integrity": "sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==",
"funding": [
{
"type": "GitHub Sponsors",
@@ -13016,6 +14169,7 @@
"url": "https://opencollective.com/unified"
}
],
+ "license": "MIT",
"dependencies": {
"@types/debug": "^4.0.0",
"debug": "^4.0.0",
@@ -13038,8 +14192,6 @@
},
"node_modules/micromark-core-commonmark": {
"version": "1.1.0",
- "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz",
- "integrity": "sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==",
"funding": [
{
"type": "GitHub Sponsors",
@@ -13050,6 +14202,7 @@
"url": "https://opencollective.com/unified"
}
],
+ "license": "MIT",
"dependencies": {
"decode-named-character-reference": "^1.0.0",
"micromark-factory-destination": "^1.0.0",
@@ -13071,8 +14224,7 @@
},
"node_modules/micromark-extension-gfm": {
"version": "2.0.3",
- "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-2.0.3.tgz",
- "integrity": "sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==",
+ "license": "MIT",
"dependencies": {
"micromark-extension-gfm-autolink-literal": "^1.0.0",
"micromark-extension-gfm-footnote": "^1.0.0",
@@ -13090,8 +14242,7 @@
},
"node_modules/micromark-extension-gfm-autolink-literal": {
"version": "1.0.5",
- "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.5.tgz",
- "integrity": "sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==",
+ "license": "MIT",
"dependencies": {
"micromark-util-character": "^1.0.0",
"micromark-util-sanitize-uri": "^1.0.0",
@@ -13105,8 +14256,7 @@
},
"node_modules/micromark-extension-gfm-footnote": {
"version": "1.1.2",
- "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.1.2.tgz",
- "integrity": "sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==",
+ "license": "MIT",
"dependencies": {
"micromark-core-commonmark": "^1.0.0",
"micromark-factory-space": "^1.0.0",
@@ -13124,8 +14274,7 @@
},
"node_modules/micromark-extension-gfm-strikethrough": {
"version": "1.0.7",
- "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.7.tgz",
- "integrity": "sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==",
+ "license": "MIT",
"dependencies": {
"micromark-util-chunked": "^1.0.0",
"micromark-util-classify-character": "^1.0.0",
@@ -13141,8 +14290,7 @@
},
"node_modules/micromark-extension-gfm-table": {
"version": "1.0.7",
- "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.7.tgz",
- "integrity": "sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==",
+ "license": "MIT",
"dependencies": {
"micromark-factory-space": "^1.0.0",
"micromark-util-character": "^1.0.0",
@@ -13157,8 +14305,7 @@
},
"node_modules/micromark-extension-gfm-tagfilter": {
"version": "1.0.2",
- "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.2.tgz",
- "integrity": "sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==",
+ "license": "MIT",
"dependencies": {
"micromark-util-types": "^1.0.0"
},
@@ -13169,8 +14316,7 @@
},
"node_modules/micromark-extension-gfm-task-list-item": {
"version": "1.0.5",
- "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.5.tgz",
- "integrity": "sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==",
+ "license": "MIT",
"dependencies": {
"micromark-factory-space": "^1.0.0",
"micromark-util-character": "^1.0.0",
@@ -13185,8 +14331,7 @@
},
"node_modules/micromark-extension-math": {
"version": "2.1.2",
- "resolved": "https://registry.npmjs.org/micromark-extension-math/-/micromark-extension-math-2.1.2.tgz",
- "integrity": "sha512-es0CcOV89VNS9wFmyn+wyFTKweXGW4CEvdaAca6SWRWPyYCbBisnjaHLjWO4Nszuiud84jCpkHsqAJoa768Pvg==",
+ "license": "MIT",
"dependencies": {
"@types/katex": "^0.16.0",
"katex": "^0.16.0",
@@ -13203,13 +14348,10 @@
},
"node_modules/micromark-extension-math/node_modules/@types/katex": {
"version": "0.16.7",
- "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.16.7.tgz",
- "integrity": "sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ=="
+ "license": "MIT"
},
"node_modules/micromark-factory-destination": {
"version": "1.1.0",
- "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz",
- "integrity": "sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==",
"funding": [
{
"type": "GitHub Sponsors",
@@ -13220,6 +14362,7 @@
"url": "https://opencollective.com/unified"
}
],
+ "license": "MIT",
"dependencies": {
"micromark-util-character": "^1.0.0",
"micromark-util-symbol": "^1.0.0",
@@ -13228,8 +14371,6 @@
},
"node_modules/micromark-factory-label": {
"version": "1.1.0",
- "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz",
- "integrity": "sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==",
"funding": [
{
"type": "GitHub Sponsors",
@@ -13240,6 +14381,7 @@
"url": "https://opencollective.com/unified"
}
],
+ "license": "MIT",
"dependencies": {
"micromark-util-character": "^1.0.0",
"micromark-util-symbol": "^1.0.0",
@@ -13249,8 +14391,6 @@
},
"node_modules/micromark-factory-space": {
"version": "1.1.0",
- "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz",
- "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==",
"funding": [
{
"type": "GitHub Sponsors",
@@ -13261,6 +14401,7 @@
"url": "https://opencollective.com/unified"
}
],
+ "license": "MIT",
"dependencies": {
"micromark-util-character": "^1.0.0",
"micromark-util-types": "^1.0.0"
@@ -13268,8 +14409,6 @@
},
"node_modules/micromark-factory-title": {
"version": "1.1.0",
- "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz",
- "integrity": "sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==",
"funding": [
{
"type": "GitHub Sponsors",
@@ -13280,6 +14419,7 @@
"url": "https://opencollective.com/unified"
}
],
+ "license": "MIT",
"dependencies": {
"micromark-factory-space": "^1.0.0",
"micromark-util-character": "^1.0.0",
@@ -13289,8 +14429,6 @@
},
"node_modules/micromark-factory-whitespace": {
"version": "1.1.0",
- "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz",
- "integrity": "sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==",
"funding": [
{
"type": "GitHub Sponsors",
@@ -13301,6 +14439,7 @@
"url": "https://opencollective.com/unified"
}
],
+ "license": "MIT",
"dependencies": {
"micromark-factory-space": "^1.0.0",
"micromark-util-character": "^1.0.0",
@@ -13310,8 +14449,6 @@
},
"node_modules/micromark-util-character": {
"version": "1.2.0",
- "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz",
- "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==",
"funding": [
{
"type": "GitHub Sponsors",
@@ -13322,6 +14459,7 @@
"url": "https://opencollective.com/unified"
}
],
+ "license": "MIT",
"dependencies": {
"micromark-util-symbol": "^1.0.0",
"micromark-util-types": "^1.0.0"
@@ -13329,8 +14467,6 @@
},
"node_modules/micromark-util-chunked": {
"version": "1.1.0",
- "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz",
- "integrity": "sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==",
"funding": [
{
"type": "GitHub Sponsors",
@@ -13341,14 +14477,13 @@
"url": "https://opencollective.com/unified"
}
],
+ "license": "MIT",
"dependencies": {
"micromark-util-symbol": "^1.0.0"
}
},
"node_modules/micromark-util-classify-character": {
"version": "1.1.0",
- "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz",
- "integrity": "sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==",
"funding": [
{
"type": "GitHub Sponsors",
@@ -13359,6 +14494,7 @@
"url": "https://opencollective.com/unified"
}
],
+ "license": "MIT",
"dependencies": {
"micromark-util-character": "^1.0.0",
"micromark-util-symbol": "^1.0.0",
@@ -13367,8 +14503,6 @@
},
"node_modules/micromark-util-combine-extensions": {
"version": "1.1.0",
- "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz",
- "integrity": "sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==",
"funding": [
{
"type": "GitHub Sponsors",
@@ -13379,6 +14513,7 @@
"url": "https://opencollective.com/unified"
}
],
+ "license": "MIT",
"dependencies": {
"micromark-util-chunked": "^1.0.0",
"micromark-util-types": "^1.0.0"
@@ -13386,8 +14521,6 @@
},
"node_modules/micromark-util-decode-numeric-character-reference": {
"version": "1.1.0",
- "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz",
- "integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==",
"funding": [
{
"type": "GitHub Sponsors",
@@ -13398,14 +14531,13 @@
"url": "https://opencollective.com/unified"
}
],
+ "license": "MIT",
"dependencies": {
"micromark-util-symbol": "^1.0.0"
}
},
"node_modules/micromark-util-decode-string": {
"version": "1.1.0",
- "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz",
- "integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==",
"funding": [
{
"type": "GitHub Sponsors",
@@ -13416,6 +14548,7 @@
"url": "https://opencollective.com/unified"
}
],
+ "license": "MIT",
"dependencies": {
"decode-named-character-reference": "^1.0.0",
"micromark-util-character": "^1.0.0",
@@ -13425,8 +14558,6 @@
},
"node_modules/micromark-util-encode": {
"version": "1.1.0",
- "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz",
- "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==",
"funding": [
{
"type": "GitHub Sponsors",
@@ -13436,12 +14567,11 @@
"type": "OpenCollective",
"url": "https://opencollective.com/unified"
}
- ]
+ ],
+ "license": "MIT"
},
"node_modules/micromark-util-html-tag-name": {
"version": "1.2.0",
- "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz",
- "integrity": "sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==",
"funding": [
{
"type": "GitHub Sponsors",
@@ -13451,12 +14581,11 @@
"type": "OpenCollective",
"url": "https://opencollective.com/unified"
}
- ]
+ ],
+ "license": "MIT"
},
"node_modules/micromark-util-normalize-identifier": {
"version": "1.1.0",
- "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz",
- "integrity": "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==",
"funding": [
{
"type": "GitHub Sponsors",
@@ -13467,14 +14596,13 @@
"url": "https://opencollective.com/unified"
}
],
+ "license": "MIT",
"dependencies": {
"micromark-util-symbol": "^1.0.0"
}
},
"node_modules/micromark-util-resolve-all": {
"version": "1.1.0",
- "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz",
- "integrity": "sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==",
"funding": [
{
"type": "GitHub Sponsors",
@@ -13485,14 +14613,13 @@
"url": "https://opencollective.com/unified"
}
],
+ "license": "MIT",
"dependencies": {
"micromark-util-types": "^1.0.0"
}
},
"node_modules/micromark-util-sanitize-uri": {
"version": "1.2.0",
- "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz",
- "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==",
"funding": [
{
"type": "GitHub Sponsors",
@@ -13503,6 +14630,7 @@
"url": "https://opencollective.com/unified"
}
],
+ "license": "MIT",
"dependencies": {
"micromark-util-character": "^1.0.0",
"micromark-util-encode": "^1.0.0",
@@ -13511,8 +14639,6 @@
},
"node_modules/micromark-util-subtokenize": {
"version": "1.1.0",
- "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz",
- "integrity": "sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==",
"funding": [
{
"type": "GitHub Sponsors",
@@ -13523,6 +14649,7 @@
"url": "https://opencollective.com/unified"
}
],
+ "license": "MIT",
"dependencies": {
"micromark-util-chunked": "^1.0.0",
"micromark-util-symbol": "^1.0.0",
@@ -13532,8 +14659,6 @@
},
"node_modules/micromark-util-symbol": {
"version": "1.1.0",
- "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz",
- "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==",
"funding": [
{
"type": "GitHub Sponsors",
@@ -13543,12 +14668,11 @@
"type": "OpenCollective",
"url": "https://opencollective.com/unified"
}
- ]
+ ],
+ "license": "MIT"
},
"node_modules/micromark-util-types": {
"version": "1.1.0",
- "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz",
- "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==",
"funding": [
{
"type": "GitHub Sponsors",
@@ -13558,12 +14682,12 @@
"type": "OpenCollective",
"url": "https://opencollective.com/unified"
}
- ]
+ ],
+ "license": "MIT"
},
"node_modules/micromatch": {
"version": "4.0.8",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
- "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"braces": "^3.0.3",
@@ -13573,11 +14697,32 @@
"node": ">=8.6"
}
},
+ "node_modules/miller-rabin": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
+ "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "bn.js": "^4.0.0",
+ "brorand": "^1.0.1"
+ },
+ "bin": {
+ "miller-rabin": "bin/miller-rabin"
+ }
+ },
+ "node_modules/miller-rabin/node_modules/bn.js": {
+ "version": "4.12.2",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz",
+ "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/mime": {
"version": "2.6.0",
- "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz",
- "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"bin": {
"mime": "cli.js"
},
@@ -13587,16 +14732,14 @@
},
"node_modules/mime-db": {
"version": "1.52.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
- "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "license": "MIT",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/mime-types": {
"version": "2.1.35",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
- "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "license": "MIT",
"dependencies": {
"mime-db": "1.52.0"
},
@@ -13606,8 +14749,7 @@
},
"node_modules/mimic-fn": {
"version": "2.1.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
- "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "devOptional": true,
"license": "MIT",
"engines": {
"node": ">=6"
@@ -13615,8 +14757,6 @@
},
"node_modules/mimic-response": {
"version": "4.0.0",
- "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz",
- "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==",
"license": "MIT",
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
@@ -13625,10 +14765,23 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/minimalistic-assert": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
+ "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/minimalistic-crypto-utils": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
+ "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/minimatch": {
"version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "license": "ISC",
"dependencies": {
"brace-expansion": "^1.1.7"
},
@@ -13638,16 +14791,23 @@
},
"node_modules/minimist": {
"version": "1.2.8",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
- "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "devOptional": true,
+ "license": "MIT",
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/mj-context-menu": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/mj-context-menu/-/mj-context-menu-0.6.1.tgz",
+ "integrity": "sha512-7NO5s6n10TIV96d4g2uDpG7ZDpIhMh0QNfGdJw/W47JswFcosz457wqz/b5sAKvl12sxINGFCn80NZHKwxQEXA==",
+ "license": "Apache-2.0"
+ },
"node_modules/mkdirp": {
"version": "0.5.6",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
- "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"minimist": "^1.2.6"
},
@@ -13657,8 +14817,7 @@
},
"node_modules/mobx": {
"version": "6.12.0",
- "resolved": "https://registry.npmjs.org/mobx/-/mobx-6.12.0.tgz",
- "integrity": "sha512-Mn6CN6meXEnMa0a5u6a5+RKrqRedHBhZGd15AWLk9O6uFY4KYHzImdt8JI8WODo1bjTSRnwXhJox+FCUZhCKCQ==",
+ "license": "MIT",
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/mobx"
@@ -13666,16 +14825,14 @@
},
"node_modules/moment": {
"version": "2.30.1",
- "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz",
- "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==",
+ "license": "MIT",
"engines": {
"node": "*"
}
},
"node_modules/moment-timezone": {
"version": "0.5.45",
- "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.45.tgz",
- "integrity": "sha512-HIWmqA86KcmCAhnMAN0wuDOARV/525R2+lOLotuGFzn4HO+FH+/645z2wx0Dt3iDv6/p61SIvKnDstISainhLQ==",
+ "license": "MIT",
"dependencies": {
"moment": "^2.29.4"
},
@@ -13685,13 +14842,11 @@
},
"node_modules/monaco-editor": {
"version": "0.34.1",
- "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.34.1.tgz",
- "integrity": "sha512-FKc80TyiMaruhJKKPz5SpJPIjL+dflGvz4CpuThaPMc94AyN7SeC9HQ8hrvaxX7EyHdJcUY5i4D0gNyJj1vSZQ=="
+ "license": "MIT"
},
"node_modules/monaco-editor-textmate": {
"version": "4.0.0",
- "resolved": "https://registry.npmjs.org/monaco-editor-textmate/-/monaco-editor-textmate-4.0.0.tgz",
- "integrity": "sha512-Clwup5LJzVfwURQrS+odSEC5/hZBEG36pQnvBKt4OtBndF8r2xLeXUZcK/AqEBK2u0Npy7frFp9hG7m66Ol9hA==",
+ "license": "MIT",
"peerDependencies": {
"monaco-editor": "0.x.x",
"monaco-textmate": "^3.0.0"
@@ -13699,8 +14854,7 @@
},
"node_modules/monaco-languageclient": {
"version": "4.0.3",
- "resolved": "https://registry.npmjs.org/monaco-languageclient/-/monaco-languageclient-4.0.3.tgz",
- "integrity": "sha512-1mGIUb5PFRknITBhNxgH0SnQy1/jntt9oo0cQpOl3HdhYEL/CYK2UrsZZX7Udqmz1PXKyRIzQ3tZ7dJn4mzWtA==",
+ "license": "MIT",
"dependencies": {
"vscode": "npm:@codingame/monaco-vscode-api@1.69.13",
"vscode-jsonrpc": "8.0.2",
@@ -13716,8 +14870,7 @@
},
"node_modules/monaco-textmate": {
"version": "3.0.1",
- "resolved": "https://registry.npmjs.org/monaco-textmate/-/monaco-textmate-3.0.1.tgz",
- "integrity": "sha512-ZxxY3OsqUczYP1sGqo97tu+CJmMBwuSW+dL0WEBdDhOZ5G1zntw72hvBc68ZQAirosWvbDKgN1dL5k173QtFww==",
+ "license": "MIT",
"dependencies": {
"fast-plist": "^0.1.2"
},
@@ -13727,21 +14880,17 @@
},
"node_modules/mri": {
"version": "1.2.0",
- "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz",
- "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==",
+ "license": "MIT",
"engines": {
"node": ">=4"
}
},
"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=="
+ "license": "MIT"
},
"node_modules/nanoid": {
"version": "3.3.8",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz",
- "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==",
"funding": [
{
"type": "github",
@@ -13758,21 +14907,21 @@
},
"node_modules/negotiator": {
"version": "0.6.3",
- "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
- "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
+ "license": "MIT",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/neo-async": {
"version": "2.6.2",
- "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
- "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="
+ "devOptional": true,
+ "license": "MIT",
+ "peer": true
},
"node_modules/no-case": {
"version": "3.0.4",
- "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
- "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
"lower-case": "^2.0.2",
"tslib": "^2.0.3"
@@ -13780,22 +14929,22 @@
},
"node_modules/nocache": {
"version": "3.0.4",
- "resolved": "https://registry.npmjs.org/nocache/-/nocache-3.0.4.tgz",
- "integrity": "sha512-WDD0bdg9mbq6F4mRxEYcPWwfA1vxd0mrvKOyxI7Xj/atfRHVeutzuWByG//jfm4uPzp0y4Kj051EORCBSQMycw==",
+ "license": "MIT",
"engines": {
"node": ">=12.0.0"
}
},
"node_modules/node-abort-controller": {
"version": "3.1.1",
- "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz",
- "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==",
- "license": "MIT"
+ "license": "MIT",
+ "optional": true,
+ "peer": true
},
"node_modules/node-dir": {
"version": "0.1.17",
- "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz",
- "integrity": "sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"minimatch": "^3.0.2"
},
@@ -13805,8 +14954,7 @@
},
"node_modules/node-fetch": {
"version": "2.7.0",
- "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
- "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
+ "license": "MIT",
"dependencies": {
"whatwg-url": "^5.0.0"
},
@@ -13824,20 +14972,16 @@
},
"node_modules/node-int64": {
"version": "0.4.0",
- "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
- "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==",
- "license": "MIT"
+ "license": "MIT",
+ "optional": true,
+ "peer": true
},
"node_modules/node-releases": {
"version": "2.0.18",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz",
- "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==",
"license": "MIT"
},
"node_modules/node-schedule": {
"version": "2.1.1",
- "resolved": "https://registry.npmjs.org/node-schedule/-/node-schedule-2.1.1.tgz",
- "integrity": "sha512-OXdegQq03OmXEjt2hZP33W2YPs/E5BcFQks46+G2gAxs4gHOIVD1u7EqlYLYSKsaIpyKCK9Gbk0ta1/gjRSMRQ==",
"license": "MIT",
"dependencies": {
"cron-parser": "^4.2.0",
@@ -13848,11 +14992,70 @@
"node": ">=6"
}
},
+ "node_modules/node-stdlib-browser": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/node-stdlib-browser/-/node-stdlib-browser-1.3.1.tgz",
+ "integrity": "sha512-X75ZN8DCLftGM5iKwoYLA3rjnrAEs97MkzvSd4q2746Tgpg8b8XWiBGiBG4ZpgcAqBgtgPHTiAc8ZMCvZuikDw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "assert": "^2.0.0",
+ "browser-resolve": "^2.0.0",
+ "browserify-zlib": "^0.2.0",
+ "buffer": "^5.7.1",
+ "console-browserify": "^1.1.0",
+ "constants-browserify": "^1.0.0",
+ "create-require": "^1.1.1",
+ "crypto-browserify": "^3.12.1",
+ "domain-browser": "4.22.0",
+ "events": "^3.0.0",
+ "https-browserify": "^1.0.0",
+ "isomorphic-timers-promises": "^1.0.1",
+ "os-browserify": "^0.3.0",
+ "path-browserify": "^1.0.1",
+ "pkg-dir": "^5.0.0",
+ "process": "^0.11.10",
+ "punycode": "^1.4.1",
+ "querystring-es3": "^0.2.1",
+ "readable-stream": "^3.6.0",
+ "stream-browserify": "^3.0.0",
+ "stream-http": "^3.2.0",
+ "string_decoder": "^1.0.0",
+ "timers-browserify": "^2.0.4",
+ "tty-browserify": "0.0.1",
+ "url": "^0.11.4",
+ "util": "^0.12.4",
+ "vm-browserify": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/node-stdlib-browser/node_modules/pkg-dir": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz",
+ "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "find-up": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/node-stdlib-browser/node_modules/punycode": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+ "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/node-stream-zip": {
"version": "1.15.0",
- "resolved": "https://registry.npmjs.org/node-stream-zip/-/node-stream-zip-1.15.0.tgz",
- "integrity": "sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"engines": {
"node": ">=0.12.0"
},
@@ -13863,9 +15066,8 @@
},
"node_modules/nodemon": {
"version": "3.0.3",
- "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.3.tgz",
- "integrity": "sha512-7jH/NXbFPxVaMwmBCC2B9F/V6X1VkEdNgx3iu9jji8WxWcvhMWkmhNWhI5077zknOnZnBzba9hZP6bCPJLSReQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"chokidar": "^3.5.2",
"debug": "^4",
@@ -13891,9 +15093,8 @@
},
"node_modules/nodemon/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,
+ "license": "ISC",
"dependencies": {
"yallist": "^4.0.0"
},
@@ -13903,9 +15104,8 @@
},
"node_modules/nodemon/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,
+ "license": "ISC",
"dependencies": {
"lru-cache": "^6.0.0"
},
@@ -13918,37 +15118,30 @@
},
"node_modules/nodemon/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
+ "dev": true,
+ "license": "ISC"
},
"node_modules/nopt": {
"version": "1.0.10",
- "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
- "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"abbrev": "1"
},
"bin": {
"nopt": "bin/nopt.js"
- },
- "engines": {
- "node": "*"
}
},
"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==",
+ "devOptional": true,
+ "license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/normalize-url": {
"version": "8.0.1",
- "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz",
- "integrity": "sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==",
"license": "MIT",
"engines": {
"node": ">=14.16"
@@ -13959,9 +15152,8 @@
},
"node_modules/now-and-later": {
"version": "3.0.0",
- "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-3.0.0.tgz",
- "integrity": "sha512-pGO4pzSdaxhWTGkfSfHx3hVzJVslFPwBp2Myq9MYN/ChfJZF87ochMAXnvz6/58RJSf5ik2q9tXprBBrk2cpcg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"once": "^1.4.0"
},
@@ -13971,8 +15163,7 @@
},
"node_modules/npm-run-path": {
"version": "4.0.1",
- "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
- "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"path-key": "^3.0.0"
@@ -13985,6 +15176,7 @@
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
"integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
+ "license": "BSD-2-Clause",
"dependencies": {
"boolbase": "^1.0.0"
},
@@ -13994,39 +15186,51 @@
},
"node_modules/nullthrows": {
"version": "1.1.1",
- "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz",
- "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw=="
+ "license": "MIT",
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/oauth-sign": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
+ "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "*"
+ }
},
"node_modules/ob1": {
"version": "0.76.9",
- "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.76.9.tgz",
- "integrity": "sha512-g0I/OLnSxf6OrN3QjSew3bTDJCdbZoWxnh8adh1z36alwCuGF1dgDeRA25bTYSakrG5WULSaWJPOdgnf1O/oQw==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"engines": {
"node": ">=16"
}
},
"node_modules/object-assign": {
"version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/object-inspect": {
- "version": "1.13.1",
- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
- "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==",
+ "version": "1.13.4",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/object-is": {
"version": "1.1.5",
- "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz",
- "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"call-bind": "^1.0.2",
"define-properties": "^1.1.3"
@@ -14040,18 +15244,16 @@
},
"node_modules/object-keys": {
"version": "1.1.1",
- "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
- "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">= 0.4"
}
},
"node_modules/object.assign": {
"version": "4.1.5",
- "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz",
- "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"call-bind": "^1.0.5",
"define-properties": "^1.2.1",
@@ -14067,8 +15269,6 @@
},
"node_modules/octokit": {
"version": "4.1.2",
- "resolved": "https://registry.npmjs.org/octokit/-/octokit-4.1.2.tgz",
- "integrity": "sha512-0kcTxJOK3yQrJsRb8wKa28hlTze4QOz4sLuUnfXXnhboDhFKgv8LxS86tFwbsafDW9JZ08ByuVAE8kQbYJIZkA==",
"license": "MIT",
"dependencies": {
"@octokit/app": "^15.1.4",
@@ -14088,8 +15288,7 @@
},
"node_modules/on-finished": {
"version": "2.4.1",
- "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
- "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+ "license": "MIT",
"dependencies": {
"ee-first": "1.1.1"
},
@@ -14099,25 +15298,24 @@
},
"node_modules/on-headers": {
"version": "1.0.2",
- "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
- "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"engines": {
"node": ">= 0.8"
}
},
"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==",
+ "devOptional": true,
+ "license": "ISC",
"dependencies": {
"wrappy": "1"
}
},
"node_modules/onetime": {
"version": "5.1.2",
- "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
- "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"mimic-fn": "^2.1.0"
@@ -14131,17 +15329,16 @@
},
"node_modules/onigasm": {
"version": "2.2.5",
- "resolved": "https://registry.npmjs.org/onigasm/-/onigasm-2.2.5.tgz",
- "integrity": "sha512-F+th54mPc0l1lp1ZcFMyL/jTs2Tlq4SqIHKIXGZOR/VkHkF9A7Fr5rRr5+ZG/lWeRsyrClLYRq7s/yFQ/XhWCA==",
+ "license": "MIT",
"dependencies": {
"lru-cache": "^5.1.1"
}
},
"node_modules/open": {
"version": "6.4.0",
- "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz",
- "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"is-wsl": "^1.1.0"
},
@@ -14151,9 +15348,9 @@
},
"node_modules/ora": {
"version": "5.4.1",
- "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz",
- "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"bl": "^4.1.0",
"chalk": "^4.1.0",
@@ -14172,69 +15369,11 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/ora/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==",
- "license": "MIT",
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/ora/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "license": "MIT",
- "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/ora/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==",
- "license": "MIT",
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/ora/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==",
- "license": "MIT"
- },
- "node_modules/ora/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==",
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/ora/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==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"ansi-regex": "^5.0.1"
},
@@ -14242,22 +15381,22 @@
"node": ">=8"
}
},
- "node_modules/ora/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==",
- "license": "MIT",
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
+ "node_modules/os-browserify": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
+ "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ospath": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz",
+ "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/p-cancelable": {
"version": "4.0.1",
- "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-4.0.1.tgz",
- "integrity": "sha512-wBowNApzd45EIKdO1LaU+LrMBwAcjfPaYtVzV3lmfM3gf8Z4CHZsiIqlM8TZZ8okYvh5A1cP6gTfCRQtwUpaUg==",
"license": "MIT",
"engines": {
"node": ">=14.16"
@@ -14265,8 +15404,8 @@
},
"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==",
+ "devOptional": true,
+ "license": "MIT",
"dependencies": {
"yocto-queue": "^0.1.0"
},
@@ -14279,8 +15418,8 @@
},
"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==",
+ "devOptional": true,
+ "license": "MIT",
"dependencies": {
"p-limit": "^3.0.2"
},
@@ -14293,8 +15432,7 @@
},
"node_modules/p-map": {
"version": "7.0.3",
- "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz",
- "integrity": "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=18"
@@ -14305,16 +15443,23 @@
},
"node_modules/p-try": {
"version": "2.2.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
- "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"engines": {
"node": ">=6"
}
},
+ "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,
+ "license": "(MIT AND Zlib)"
+ },
"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==",
+ "license": "MIT",
"dependencies": {
"callsites": "^3.0.0"
},
@@ -14322,10 +15467,55 @@
"node": ">=6"
}
},
+ "node_modules/parse-asn1": {
+ "version": "5.1.7",
+ "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.7.tgz",
+ "integrity": "sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "asn1.js": "^4.10.1",
+ "browserify-aes": "^1.2.0",
+ "evp_bytestokey": "^1.0.3",
+ "hash-base": "~3.0",
+ "pbkdf2": "^3.1.2",
+ "safe-buffer": "^5.2.1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/parse-entities": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz",
+ "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==",
+ "license": "MIT",
+ "dependencies": {
+ "character-entities": "^1.0.0",
+ "character-entities-legacy": "^1.0.0",
+ "character-reference-invalid": "^1.0.0",
+ "is-alphanumerical": "^1.0.0",
+ "is-decimal": "^1.0.0",
+ "is-hexadecimal": "^1.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/parse-entities/node_modules/character-entities": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz",
+ "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
"node_modules/parse-json": {
"version": "5.2.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
- "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+ "license": "MIT",
"dependencies": {
"@babel/code-frame": "^7.0.0",
"error-ex": "^1.3.1",
@@ -14340,94 +15530,142 @@
}
},
"node_modules/parse5": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz",
- "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==",
+ "version": "7.3.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz",
+ "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==",
+ "license": "MIT",
"dependencies": {
- "entities": "^4.4.0"
+ "entities": "^6.0.0"
},
"funding": {
"url": "https://github.com/inikulin/parse5?sponsor=1"
}
},
"node_modules/parse5-htmlparser2-tree-adapter": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz",
- "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==",
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz",
+ "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==",
+ "license": "MIT",
+ "dependencies": {
+ "domhandler": "^5.0.3",
+ "parse5": "^7.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/inikulin/parse5?sponsor=1"
+ }
+ },
+ "node_modules/parse5-parser-stream": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz",
+ "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==",
+ "license": "MIT",
"dependencies": {
- "domhandler": "^5.0.2",
"parse5": "^7.0.0"
},
"funding": {
"url": "https://github.com/inikulin/parse5?sponsor=1"
}
},
+ "node_modules/parse5/node_modules/entities": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz",
+ "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
"node_modules/parseurl": {
"version": "1.3.3",
- "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
- "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+ "license": "MIT",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/path-browserify": {
"version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz",
- "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g=="
+ "license": "MIT"
},
"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==",
+ "devOptional": true,
+ "license": "MIT",
"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==",
+ "license": "MIT",
+ "optional": true,
+ "peer": 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==",
+ "license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/path-parse": {
"version": "1.0.7",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
- "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
+ "license": "MIT"
},
"node_modules/path-to-regexp": {
"version": "0.1.12",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz",
- "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==",
"license": "MIT"
},
"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==",
+ "license": "MIT",
"engines": {
"node": ">=8"
}
},
+ "node_modules/pbkdf2": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz",
+ "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "create-hash": "^1.1.2",
+ "create-hmac": "^1.1.4",
+ "ripemd160": "^2.0.1",
+ "safe-buffer": "^5.0.1",
+ "sha.js": "^2.4.8"
+ },
+ "engines": {
+ "node": ">=0.12"
+ }
+ },
+ "node_modules/pend": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
+ "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/performance-now": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+ "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==",
+ "license": "MIT"
+ },
"node_modules/picocolors": {
"version": "1.1.1",
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
- "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
"license": "ISC"
},
"node_modules/picomatch": {
"version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "devOptional": true,
+ "license": "MIT",
"engines": {
"node": ">=8.6"
},
@@ -14437,24 +15675,27 @@
},
"node_modules/pify": {
"version": "4.0.1",
- "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
- "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"engines": {
"node": ">=6"
}
},
"node_modules/pirates": {
"version": "4.0.6",
- "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
- "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"engines": {
"node": ">= 6"
}
},
"node_modules/pkg-dir": {
"version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz",
- "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"find-up": "^3.0.0"
},
@@ -14464,8 +15705,9 @@
},
"node_modules/pkg-dir/node_modules/find-up": {
"version": "3.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
- "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"locate-path": "^3.0.0"
},
@@ -14475,8 +15717,9 @@
},
"node_modules/pkg-dir/node_modules/locate-path": {
"version": "3.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
- "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"p-locate": "^3.0.0",
"path-exists": "^3.0.0"
@@ -14487,8 +15730,9 @@
},
"node_modules/pkg-dir/node_modules/p-limit": {
"version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"p-try": "^2.0.0"
},
@@ -14501,8 +15745,9 @@
},
"node_modules/pkg-dir/node_modules/p-locate": {
"version": "3.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
- "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"p-limit": "^2.0.0"
},
@@ -14512,16 +15757,25 @@
},
"node_modules/pkg-dir/node_modules/path-exists": {
"version": "3.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
- "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"engines": {
"node": ">=4"
}
},
+ "node_modules/possible-typed-array-names": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz",
+ "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/postcss": {
"version": "8.5.3",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz",
- "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==",
"funding": [
{
"type": "opencollective",
@@ -14548,9 +15802,8 @@
},
"node_modules/postcss-modules-extract-imports": {
"version": "3.0.0",
- "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz",
- "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==",
"dev": true,
+ "license": "ISC",
"engines": {
"node": "^10 || ^12 || >= 14"
},
@@ -14560,9 +15813,8 @@
},
"node_modules/postcss-modules-local-by-default": {
"version": "4.0.4",
- "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.4.tgz",
- "integrity": "sha512-L4QzMnOdVwRm1Qb8m4x8jsZzKAaPAgrUF1r/hjDR2Xj7R+8Zsf97jAlSQzWtKx5YNiNGN8QxmPFIc/sh+RQl+Q==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"icss-utils": "^5.0.0",
"postcss-selector-parser": "^6.0.2",
@@ -14577,9 +15829,8 @@
},
"node_modules/postcss-modules-scope": {
"version": "3.1.1",
- "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.1.1.tgz",
- "integrity": "sha512-uZgqzdTleelWjzJY+Fhti6F3C9iF1JR/dODLs/JDefozYcKTBCdD8BIl6nNPbTbcLnGrk56hzwZC2DaGNvYjzA==",
"dev": true,
+ "license": "ISC",
"dependencies": {
"postcss-selector-parser": "^6.0.4"
},
@@ -14592,9 +15843,8 @@
},
"node_modules/postcss-modules-values": {
"version": "4.0.0",
- "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz",
- "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==",
"dev": true,
+ "license": "ISC",
"dependencies": {
"icss-utils": "^5.0.0"
},
@@ -14607,9 +15857,8 @@
},
"node_modules/postcss-selector-parser": {
"version": "6.0.15",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz",
- "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"cssesc": "^3.0.0",
"util-deprecate": "^1.0.2"
@@ -14620,15 +15869,26 @@
},
"node_modules/postcss-value-parser": {
"version": "4.2.0",
- "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
- "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/pretty-bytes": {
+ "version": "5.6.0",
+ "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz",
+ "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
},
"node_modules/pretty-format": {
"version": "27.5.1",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz",
- "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"ansi-regex": "^5.0.1",
"ansi-styles": "^5.0.0",
@@ -14640,9 +15900,8 @@
},
"node_modules/pretty-format/node_modules/ansi-styles": {
"version": "5.2.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
- "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=10"
},
@@ -14652,28 +15911,47 @@
},
"node_modules/pretty-format/node_modules/react-is": {
"version": "17.0.2",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
- "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/prismjs": {
+ "version": "1.30.0",
+ "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz",
+ "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/process": {
+ "version": "0.11.10",
+ "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+ "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6.0"
+ }
},
"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=="
+ "devOptional": true,
+ "license": "MIT"
},
"node_modules/promise": {
"version": "8.3.0",
- "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz",
- "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"asap": "~2.0.6"
}
},
"node_modules/prompts": {
"version": "2.4.2",
- "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
- "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"kleur": "^3.0.3",
"sisteransi": "^1.0.5"
@@ -14684,8 +15962,7 @@
},
"node_modules/prop-types": {
"version": "15.8.1",
- "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
- "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
+ "license": "MIT",
"dependencies": {
"loose-envify": "^1.4.0",
"object-assign": "^4.1.1",
@@ -14694,13 +15971,11 @@
},
"node_modules/prop-types/node_modules/react-is": {
"version": "16.13.1",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
- "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
+ "license": "MIT"
},
"node_modules/property-information": {
"version": "6.4.1",
- "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.4.1.tgz",
- "integrity": "sha512-OHYtXfu5aI2sS2LWFSN5rgJjrQ4pCy8i1jubJLe2QvMF8JJ++HXTUIVWFLfXJoaOfvYYjk2SN8J2wFUWIGXT4w==",
+ "license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/wooorm"
@@ -14708,8 +15983,7 @@
},
"node_modules/proxy-addr": {
"version": "2.0.7",
- "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
- "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
+ "license": "MIT",
"dependencies": {
"forwarded": "0.2.0",
"ipaddr.js": "1.9.1"
@@ -14719,29 +15993,71 @@
}
},
"node_modules/proxy-from-env": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
- "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz",
+ "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/psl": {
+ "version": "1.15.0",
+ "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz",
+ "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==",
+ "license": "MIT",
+ "dependencies": {
+ "punycode": "^2.3.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/lupomontero"
+ }
},
"node_modules/pstree.remy": {
"version": "1.1.8",
- "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
- "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/public-encrypt": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz",
+ "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "bn.js": "^4.1.0",
+ "browserify-rsa": "^4.0.0",
+ "create-hash": "^1.1.0",
+ "parse-asn1": "^5.0.0",
+ "randombytes": "^2.0.1",
+ "safe-buffer": "^5.1.2"
+ }
+ },
+ "node_modules/public-encrypt/node_modules/bn.js": {
+ "version": "4.12.2",
+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz",
+ "integrity": "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/pump": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz",
+ "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.1"
+ }
},
"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,
+ "license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/qs": {
"version": "6.13.0",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
- "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
"license": "BSD-3-Clause",
"dependencies": {
"side-channel": "^1.0.6"
@@ -14753,19 +16069,27 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/querystring-es3": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
+ "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.x"
+ }
+ },
"node_modules/queue": {
"version": "6.0.2",
- "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz",
- "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"inherits": "~2.0.3"
}
},
"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",
@@ -14784,14 +16108,11 @@
},
"node_modules/queue-tick": {
"version": "1.0.1",
- "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz",
- "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/quick-lru": {
"version": "5.1.1",
- "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
- "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
"license": "MIT",
"engines": {
"node": ">=10"
@@ -14802,26 +16123,32 @@
},
"node_modules/randombytes": {
"version": "2.1.0",
- "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
- "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
"dev": true,
- "peer": true,
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "node_modules/randomfill": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
+ "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
+ "randombytes": "^2.0.5",
"safe-buffer": "^5.1.0"
}
},
"node_modules/range-parser": {
"version": "1.2.1",
- "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
- "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+ "license": "MIT",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/raw-body": {
"version": "2.5.2",
- "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
- "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
"license": "MIT",
"dependencies": {
"bytes": "3.1.2",
@@ -14835,8 +16162,7 @@
},
"node_modules/react": {
"version": "18.2.0",
- "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz",
- "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==",
+ "license": "MIT",
"dependencies": {
"loose-envify": "^1.1.0"
},
@@ -14844,10 +16170,22 @@
"node": ">=0.10.0"
}
},
+ "node_modules/react-contenteditable": {
+ "version": "3.3.7",
+ "resolved": "https://registry.npmjs.org/react-contenteditable/-/react-contenteditable-3.3.7.tgz",
+ "integrity": "sha512-GA9NbC0DkDdpN3iGvib/OMHWTJzDX2cfkgy5Tt98JJAbA3kLnyrNbBIpsSpPpq7T8d3scD39DHP+j8mAM7BIfQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "prop-types": "^15.7.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.3"
+ }
+ },
"node_modules/react-country-flag": {
"version": "3.1.0",
- "resolved": "https://registry.npmjs.org/react-country-flag/-/react-country-flag-3.1.0.tgz",
- "integrity": "sha512-JWQFw1efdv9sTC+TGQvTKXQg1NKbDU2mBiAiRWcKM9F1sK+/zjhP2yGmm8YDddWyZdXVkR8Md47rPMJmo4YO5g==",
+ "license": "MIT",
"engines": {
"node": ">=12"
},
@@ -14857,8 +16195,9 @@
},
"node_modules/react-devtools-core": {
"version": "4.28.5",
- "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-4.28.5.tgz",
- "integrity": "sha512-cq/o30z9W2Wb4rzBefjv5fBalHU0rJGZCHAkf/RHSBWSSYwh8PlQTqqOJmgIIbBtpj27T6FIPXeomIjZtCNVqA==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"shell-quote": "^1.6.1",
"ws": "^7"
@@ -14866,9 +16205,9 @@
},
"node_modules/react-devtools-core/node_modules/ws": {
"version": "7.5.10",
- "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz",
- "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"engines": {
"node": ">=8.3.0"
},
@@ -14887,8 +16226,7 @@
},
"node_modules/react-dom": {
"version": "18.2.0",
- "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz",
- "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==",
+ "license": "MIT",
"dependencies": {
"loose-envify": "^1.1.0",
"scheduler": "^0.23.0"
@@ -14899,13 +16237,11 @@
},
"node_modules/react-fast-compare": {
"version": "3.2.2",
- "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz",
- "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ=="
+ "license": "MIT"
},
"node_modules/react-i18next": {
"version": "14.1.0",
- "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-14.1.0.tgz",
- "integrity": "sha512-3KwX6LHpbvGQ+sBEntjV4sYW3Zovjjl3fpoHbUwSgFHf0uRBcbeCBLR5al6ikncI5+W0EFb71QXZmfop+J6NrQ==",
+ "license": "MIT",
"dependencies": {
"@babel/runtime": "^7.23.9",
"html-parse-stringify": "^3.0.1"
@@ -14925,13 +16261,11 @@
},
"node_modules/react-is": {
"version": "18.2.0",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz",
- "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w=="
+ "license": "MIT"
},
"node_modules/react-markdown": {
"version": "8.0.7",
- "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-8.0.7.tgz",
- "integrity": "sha512-bvWbzG4MtOU62XqBx3Xx+zB2raaFFsq4mYiAzfjXJMEz2sixgeAfraA3tvzULF02ZdOMUOKTBFFaZJDDrq+BJQ==",
+ "license": "MIT",
"dependencies": {
"@types/hast": "^2.0.0",
"@types/prop-types": "^15.0.0",
@@ -14960,9 +16294,9 @@
},
"node_modules/react-native": {
"version": "0.72.17",
- "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.72.17.tgz",
- "integrity": "sha512-k3dNe0XqoYCGGWTenbupWSj+ljW3GIfmYS5P4s3if4j0csx2YbenKgH1aJNWLp+UP7ONwfId6G+uBoUJfyMxXg==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@jest/create-cache-key-function": "^29.2.1",
"@react-native-community/cli": "^11.4.1",
@@ -15014,8 +16348,9 @@
},
"node_modules/react-native/node_modules/@jest/types": {
"version": "26.6.2",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz",
- "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@types/istanbul-lib-coverage": "^2.0.0",
"@types/istanbul-reports": "^3.0.0",
@@ -15029,16 +16364,18 @@
},
"node_modules/react-native/node_modules/@types/yargs": {
"version": "15.0.19",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.19.tgz",
- "integrity": "sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@types/yargs-parser": "*"
}
},
"node_modules/react-native/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==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"color-convert": "^2.0.1"
},
@@ -15049,25 +16386,11 @@
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
- "node_modules/react-native/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "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/react-native/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==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"color-name": "~1.1.4"
},
@@ -15077,21 +16400,15 @@
},
"node_modules/react-native/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=="
- },
- "node_modules/react-native/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==",
- "engines": {
- "node": ">=8"
- }
+ "license": "MIT",
+ "optional": true,
+ "peer": true
},
"node_modules/react-native/node_modules/pretty-format": {
"version": "26.6.2",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz",
- "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@jest/types": "^26.6.2",
"ansi-regex": "^5.0.0",
@@ -15104,54 +16421,46 @@
},
"node_modules/react-native/node_modules/react-is": {
"version": "17.0.2",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
- "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="
+ "license": "MIT",
+ "optional": true,
+ "peer": true
},
"node_modules/react-native/node_modules/react-refresh": {
"version": "0.4.3",
- "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.4.3.tgz",
- "integrity": "sha512-Hwln1VNuGl/6bVwnd0Xdn1e84gT/8T9aYNL+HAKDArLCS7LWjwr7StE30IEYbIkx0Vi3vs+coQxe+SQDbGbbpA==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/react-native/node_modules/regenerator-runtime": {
"version": "0.13.11",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
- "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="
+ "license": "MIT",
+ "optional": true,
+ "peer": true
},
"node_modules/react-native/node_modules/scheduler": {
"version": "0.24.0-canary-efb381bbf-20230505",
- "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.24.0-canary-efb381bbf-20230505.tgz",
- "integrity": "sha512-ABvovCDe/k9IluqSh4/ISoq8tIJnW8euVAWYt5j/bg6dRnqwQwiGO1F/V4AyK96NGF/FB04FhOUDuWj8IKfABA==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"loose-envify": "^1.1.0"
}
},
- "node_modules/react-native/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==",
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/react-native/node_modules/ws": {
"version": "6.2.3",
- "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz",
- "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"async-limiter": "~1.0.0"
}
},
"node_modules/react-popper": {
"version": "2.3.0",
- "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-2.3.0.tgz",
- "integrity": "sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q==",
+ "license": "MIT",
"dependencies": {
"react-fast-compare": "^3.0.1",
"warning": "^4.0.2"
@@ -15164,8 +16473,7 @@
},
"node_modules/react-redux": {
"version": "8.1.3",
- "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-8.1.3.tgz",
- "integrity": "sha512-n0ZrutD7DaX/j9VscF+uTALI3oUPa/pO4Z3soOBIjuRn/FzVu6aehhysxZCLi6y7duMf52WNZGMl7CtuK5EnRw==",
+ "license": "MIT",
"dependencies": {
"@babel/runtime": "^7.12.1",
"@types/hoist-non-react-statics": "^3.3.1",
@@ -15202,17 +16510,15 @@
},
"node_modules/react-refresh": {
"version": "0.14.0",
- "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz",
- "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/react-router": {
"version": "6.22.0",
- "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.22.0.tgz",
- "integrity": "sha512-q2yemJeg6gw/YixRlRnVx6IRJWZD6fonnfZhN1JIOhV2iJCPeRNSH3V1ISwHf+JWcESzLC3BOLD1T07tmO5dmg==",
+ "license": "MIT",
"dependencies": {
"@remix-run/router": "1.15.0"
},
@@ -15225,8 +16531,7 @@
},
"node_modules/react-router-dom": {
"version": "6.22.0",
- "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.22.0.tgz",
- "integrity": "sha512-z2w+M4tH5wlcLmH3BMMOMdrtrJ9T3oJJNsAlBJbwk+8Syxd5WFJ7J5dxMEW0/GEXD1BBis4uXRrNIz3mORr0ag==",
+ "license": "MIT",
"dependencies": {
"@remix-run/router": "1.15.0",
"react-router": "6.22.0"
@@ -15241,8 +16546,9 @@
},
"node_modules/react-shallow-renderer": {
"version": "16.15.0",
- "resolved": "https://registry.npmjs.org/react-shallow-renderer/-/react-shallow-renderer-16.15.0.tgz",
- "integrity": "sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"object-assign": "^4.1.1",
"react-is": "^16.12.0 || ^17.0.0 || ^18.0.0"
@@ -15253,8 +16559,7 @@
},
"node_modules/react-split": {
"version": "2.0.14",
- "resolved": "https://registry.npmjs.org/react-split/-/react-split-2.0.14.tgz",
- "integrity": "sha512-bKWydgMgaKTg/2JGQnaJPg51T6dmumTWZppFgEbbY0Fbme0F5TuatAScCLaqommbGQQf/ZT1zaejuPDriscISA==",
+ "license": "MIT",
"dependencies": {
"prop-types": "^15.5.7",
"split.js": "^1.6.0"
@@ -15263,10 +16568,26 @@
"react": "*"
}
},
+ "node_modules/react-syntax-highlighter": {
+ "version": "15.6.1",
+ "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-15.6.1.tgz",
+ "integrity": "sha512-OqJ2/vL7lEeV5zTJyG7kmARppUjiB9h9udl4qHQjjgEos66z00Ia0OckwYfRxCSFrW8RJIBnsBwQsHZbVPspqg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.3.1",
+ "highlight.js": "^10.4.1",
+ "highlightjs-vue": "^1.0.0",
+ "lowlight": "^1.17.0",
+ "prismjs": "^1.27.0",
+ "refractor": "^3.6.0"
+ },
+ "peerDependencies": {
+ "react": ">= 0.14.0"
+ }
+ },
"node_modules/react-transition-group": {
"version": "4.4.5",
- "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz",
- "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==",
+ "license": "BSD-3-Clause",
"dependencies": {
"@babel/runtime": "^7.5.5",
"dom-helpers": "^5.0.1",
@@ -15280,8 +16601,7 @@
},
"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==",
+ "license": "MIT",
"dependencies": {
"inherits": "^2.0.3",
"string_decoder": "^1.1.1",
@@ -15293,8 +16613,8 @@
},
"node_modules/readdirp": {
"version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
- "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
"picomatch": "^2.2.1"
},
@@ -15304,14 +16624,15 @@
},
"node_modules/readline": {
"version": "1.3.0",
- "resolved": "https://registry.npmjs.org/readline/-/readline-1.3.0.tgz",
- "integrity": "sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==",
- "license": "BSD"
+ "license": "BSD",
+ "optional": true,
+ "peer": true
},
"node_modules/recast": {
"version": "0.21.5",
- "resolved": "https://registry.npmjs.org/recast/-/recast-0.21.5.tgz",
- "integrity": "sha512-hjMmLaUXAm1hIuTqOdeYObMslq/q+Xff6QE3Y2P+uoHAg2nmVlLBps2hzh1UJDdMtDTMXOFewK6ky51JQIeECg==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"ast-types": "0.15.2",
"esprima": "~4.0.0",
@@ -15324,37 +16645,122 @@
},
"node_modules/recast/node_modules/source-map": {
"version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "license": "BSD-3-Clause",
+ "optional": true,
+ "peer": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/redux": {
"version": "4.2.1",
- "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz",
- "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==",
+ "license": "MIT",
"dependencies": {
"@babel/runtime": "^7.9.2"
}
},
"node_modules/redux-thunk": {
"version": "2.4.2",
- "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz",
- "integrity": "sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==",
+ "license": "MIT",
"peerDependencies": {
"redux": "^4"
}
},
+ "node_modules/refractor": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/refractor/-/refractor-3.6.0.tgz",
+ "integrity": "sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==",
+ "license": "MIT",
+ "dependencies": {
+ "hastscript": "^6.0.0",
+ "parse-entities": "^2.0.0",
+ "prismjs": "~1.27.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/refractor/node_modules/comma-separated-tokens": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz",
+ "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/refractor/node_modules/hast-util-parse-selector": {
+ "version": "2.2.5",
+ "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz",
+ "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/refractor/node_modules/hastscript": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz",
+ "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^2.0.0",
+ "comma-separated-tokens": "^1.0.0",
+ "hast-util-parse-selector": "^2.0.0",
+ "property-information": "^5.0.0",
+ "space-separated-tokens": "^1.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/refractor/node_modules/prismjs": {
+ "version": "1.27.0",
+ "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz",
+ "integrity": "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/refractor/node_modules/property-information": {
+ "version": "5.6.0",
+ "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz",
+ "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==",
+ "license": "MIT",
+ "dependencies": {
+ "xtend": "^4.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/refractor/node_modules/space-separated-tokens": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz",
+ "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
"node_modules/regenerate": {
"version": "1.4.2",
- "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
- "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A=="
+ "license": "MIT",
+ "optional": true,
+ "peer": true
},
"node_modules/regenerate-unicode-properties": {
"version": "10.1.1",
- "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz",
- "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"regenerate": "^1.4.2"
},
@@ -15364,13 +16770,12 @@
},
"node_modules/regenerator-runtime": {
"version": "0.14.1",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
- "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
+ "license": "MIT"
},
"node_modules/regenerator-transform": {
"version": "0.15.2",
- "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz",
- "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==",
+ "license": "MIT",
+ "optional": true,
"peer": true,
"dependencies": {
"@babel/runtime": "^7.8.4"
@@ -15378,9 +16783,8 @@
},
"node_modules/regexp.prototype.flags": {
"version": "1.5.1",
- "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz",
- "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"call-bind": "^1.0.2",
"define-properties": "^1.2.0",
@@ -15395,8 +16799,9 @@
},
"node_modules/regexpu-core": {
"version": "5.3.2",
- "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz",
- "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"@babel/regjsgen": "^0.8.0",
"regenerate": "^1.4.2",
@@ -15409,36 +16814,312 @@
"node": ">=4"
}
},
- "node_modules/regjsparser": {
- "version": "0.9.1",
- "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz",
- "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==",
+ "node_modules/regjsparser": {
+ "version": "0.9.1",
+ "license": "BSD-2-Clause",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "jsesc": "~0.5.0"
+ },
+ "bin": {
+ "regjsparser": "bin/parser"
+ }
+ },
+ "node_modules/regjsparser/node_modules/jsesc": {
+ "version": "0.5.0",
+ "optional": true,
+ "peer": true,
+ "bin": {
+ "jsesc": "bin/jsesc"
+ }
+ },
+ "node_modules/rehype-katex": {
+ "version": "6.0.3",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^2.0.0",
+ "@types/katex": "^0.14.0",
+ "hast-util-from-html-isomorphic": "^1.0.0",
+ "hast-util-to-text": "^3.1.0",
+ "katex": "^0.16.0",
+ "unist-util-visit": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/rehype-mathjax": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/rehype-mathjax/-/rehype-mathjax-7.1.0.tgz",
+ "integrity": "sha512-mJHNpoqCC5UZ24OKx0wNjlzV18qeJz/Q/LtEjxXzt8vqrZ1Z3GxQnVrHcF5/PogcXUK8cWwJ4U/LWOQWEiABHw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/mathjax": "^0.0.40",
+ "hast-util-to-text": "^4.0.0",
+ "hastscript": "^9.0.0",
+ "mathjax-full": "^3.0.0",
+ "unified": "^11.0.0",
+ "unist-util-visit-parents": "^6.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/rehype-mathjax/node_modules/@types/hast": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz",
+ "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/rehype-mathjax/node_modules/@types/unist": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
+ "license": "MIT"
+ },
+ "node_modules/rehype-mathjax/node_modules/hast-util-is-element": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz",
+ "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/rehype-mathjax/node_modules/hast-util-parse-selector": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz",
+ "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/rehype-mathjax/node_modules/hast-util-to-text": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz",
+ "integrity": "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/unist": "^3.0.0",
+ "hast-util-is-element": "^3.0.0",
+ "unist-util-find-after": "^5.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/rehype-mathjax/node_modules/hastscript": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz",
+ "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "comma-separated-tokens": "^2.0.0",
+ "hast-util-parse-selector": "^4.0.0",
+ "property-information": "^7.0.0",
+ "space-separated-tokens": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/rehype-mathjax/node_modules/property-information": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz",
+ "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/rehype-mathjax/node_modules/unified": {
+ "version": "11.0.5",
+ "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz",
+ "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "bail": "^2.0.0",
+ "devlop": "^1.0.0",
+ "extend": "^3.0.0",
+ "is-plain-obj": "^4.0.0",
+ "trough": "^2.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/rehype-mathjax/node_modules/unist-util-find-after": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz",
+ "integrity": "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-is": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/rehype-mathjax/node_modules/unist-util-is": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz",
+ "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/rehype-mathjax/node_modules/unist-util-stringify-position": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz",
+ "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/rehype-mathjax/node_modules/unist-util-visit-parents": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz",
+ "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-is": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/rehype-mathjax/node_modules/vfile": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz",
+ "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/rehype-mathjax/node_modules/vfile-message": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz",
+ "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-stringify-position": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/rehype-raw": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz",
+ "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "hast-util-raw": "^9.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/rehype-raw/node_modules/@types/hast": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz",
+ "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/rehype-raw/node_modules/@types/unist": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
+ "license": "MIT"
+ },
+ "node_modules/rehype-raw/node_modules/unist-util-stringify-position": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz",
+ "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==",
+ "license": "MIT",
"dependencies": {
- "jsesc": "~0.5.0"
+ "@types/unist": "^3.0.0"
},
- "bin": {
- "regjsparser": "bin/parser"
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
}
},
- "node_modules/regjsparser/node_modules/jsesc": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
- "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==",
- "bin": {
- "jsesc": "bin/jsesc"
+ "node_modules/rehype-raw/node_modules/vfile": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz",
+ "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
}
},
- "node_modules/rehype-katex": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/rehype-katex/-/rehype-katex-6.0.3.tgz",
- "integrity": "sha512-ByZlRwRUcWegNbF70CVRm2h/7xy7jQ3R9LaY4VVSvjnoVWwWVhNL60DiZsBpC5tSzYQOCvDbzncIpIjPZWodZA==",
+ "node_modules/rehype-raw/node_modules/vfile-message": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz",
+ "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==",
+ "license": "MIT",
"dependencies": {
- "@types/hast": "^2.0.0",
- "@types/katex": "^0.14.0",
- "hast-util-from-html-isomorphic": "^1.0.0",
- "hast-util-to-text": "^3.1.0",
- "katex": "^0.16.0",
- "unist-util-visit": "^4.0.0"
+ "@types/unist": "^3.0.0",
+ "unist-util-stringify-position": "^4.0.0"
},
"funding": {
"type": "opencollective",
@@ -15447,8 +17128,7 @@
},
"node_modules/remark-gfm": {
"version": "3.0.1",
- "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-3.0.1.tgz",
- "integrity": "sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==",
+ "license": "MIT",
"dependencies": {
"@types/mdast": "^3.0.0",
"mdast-util-gfm": "^2.0.0",
@@ -15462,8 +17142,7 @@
},
"node_modules/remark-math": {
"version": "5.1.1",
- "resolved": "https://registry.npmjs.org/remark-math/-/remark-math-5.1.1.tgz",
- "integrity": "sha512-cE5T2R/xLVtfFI4cCePtiRn+e6jKMtFDR3P8V3qpv8wpKjwvHoBA4eJzvX+nVrnlNy0911bdGmuspCSwetfYHw==",
+ "license": "MIT",
"dependencies": {
"@types/mdast": "^3.0.0",
"mdast-util-math": "^2.0.0",
@@ -15477,8 +17156,7 @@
},
"node_modules/remark-parse": {
"version": "10.0.2",
- "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.2.tgz",
- "integrity": "sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==",
+ "license": "MIT",
"dependencies": {
"@types/mdast": "^3.0.0",
"mdast-util-from-markdown": "^1.0.0",
@@ -15491,8 +17169,7 @@
},
"node_modules/remark-rehype": {
"version": "10.1.0",
- "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-10.1.0.tgz",
- "integrity": "sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==",
+ "license": "MIT",
"dependencies": {
"@types/hast": "^2.0.0",
"@types/mdast": "^3.0.0",
@@ -15506,42 +17183,154 @@
},
"node_modules/remove-trailing-separator": {
"version": "1.1.0",
- "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
- "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==",
- "dev": true
+ "dev": true,
+ "license": "ISC"
},
"node_modules/replace-ext": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-2.0.0.tgz",
- "integrity": "sha512-UszKE5KVK6JvyD92nzMn9cDapSk6w/CaFZ96CnmDMUqH9oowfxF/ZjRITD25H4DnOQClLA4/j7jLGXXLVKxAug==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">= 10"
}
},
+ "node_modules/request": {
+ "version": "2.88.2",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
+ "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
+ "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "aws-sign2": "~0.7.0",
+ "aws4": "^1.8.0",
+ "caseless": "~0.12.0",
+ "combined-stream": "~1.0.6",
+ "extend": "~3.0.2",
+ "forever-agent": "~0.6.1",
+ "form-data": "~2.3.2",
+ "har-validator": "~5.1.3",
+ "http-signature": "~1.2.0",
+ "is-typedarray": "~1.0.0",
+ "isstream": "~0.1.2",
+ "json-stringify-safe": "~5.0.1",
+ "mime-types": "~2.1.19",
+ "oauth-sign": "~0.9.0",
+ "performance-now": "^2.1.0",
+ "qs": "~6.5.2",
+ "safe-buffer": "^5.1.2",
+ "tough-cookie": "~2.5.0",
+ "tunnel-agent": "^0.6.0",
+ "uuid": "^3.3.2"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/request-progress": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz",
+ "integrity": "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==",
+ "license": "MIT",
+ "dependencies": {
+ "throttleit": "^1.0.0"
+ }
+ },
+ "node_modules/request/node_modules/form-data": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
+ "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
+ "license": "MIT",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.6",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 0.12"
+ }
+ },
+ "node_modules/request/node_modules/http-signature": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
+ "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==",
+ "license": "MIT",
+ "dependencies": {
+ "assert-plus": "^1.0.0",
+ "jsprim": "^1.2.2",
+ "sshpk": "^1.7.0"
+ },
+ "engines": {
+ "node": ">=0.8",
+ "npm": ">=1.3.7"
+ }
+ },
+ "node_modules/request/node_modules/jsprim": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz",
+ "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==",
+ "license": "MIT",
+ "dependencies": {
+ "assert-plus": "1.0.0",
+ "extsprintf": "1.3.0",
+ "json-schema": "0.4.0",
+ "verror": "1.10.0"
+ },
+ "engines": {
+ "node": ">=0.6.0"
+ }
+ },
+ "node_modules/request/node_modules/qs": {
+ "version": "6.5.3",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz",
+ "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/request/node_modules/tough-cookie": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
+ "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "psl": "^1.1.28",
+ "punycode": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/request/node_modules/uuid": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
+ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
+ "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.",
+ "license": "MIT",
+ "bin": {
+ "uuid": "bin/uuid"
+ }
+ },
"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==",
+ "license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/require-main-filename": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
- "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
- "license": "ISC"
+ "license": "ISC",
+ "optional": true,
+ "peer": true
},
"node_modules/reselect": {
"version": "4.1.8",
- "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz",
- "integrity": "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ=="
+ "license": "MIT"
},
"node_modules/resolve": {
"version": "1.22.8",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
- "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
+ "license": "MIT",
"dependencies": {
"is-core-module": "^2.13.0",
"path-parse": "^1.0.7",
@@ -15556,23 +17345,19 @@
},
"node_modules/resolve-alpn": {
"version": "1.2.1",
- "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz",
- "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==",
"license": "MIT"
},
"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==",
+ "license": "MIT",
"engines": {
"node": ">=4"
}
},
"node_modules/resolve-options": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-2.0.0.tgz",
- "integrity": "sha512-/FopbmmFOQCfsCx77BRFdKOniglTiHumLgwvd6IDPihy1GKkadZbgQJBcTb2lMzSR1pndzd96b1nZrreZ7+9/A==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"value-or-function": "^4.0.0"
},
@@ -15582,8 +17367,6 @@
},
"node_modules/responselike": {
"version": "3.0.0",
- "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz",
- "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==",
"license": "MIT",
"dependencies": {
"lowercase-keys": "^3.0.0"
@@ -15597,8 +17380,7 @@
},
"node_modules/restore-cursor": {
"version": "3.1.0",
- "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
- "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"onetime": "^5.1.0",
@@ -15610,19 +17392,25 @@
},
"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,
+ "license": "MIT",
"engines": {
"iojs": ">=1.0.0",
"node": ">=0.10.0"
}
},
+ "node_modules/rfdc": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz",
+ "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/rimraf": {
"version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
- "deprecated": "Rimraf versions prior to v4 are no longer supported",
"license": "ISC",
+ "optional": true,
+ "peer": true,
"dependencies": {
"glob": "^7.1.3"
},
@@ -15633,26 +17421,59 @@
"url": "https://github.com/sponsors/isaacs"
}
},
+ "node_modules/ripemd160": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
+ "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "hash-base": "^3.0.0",
+ "inherits": "^2.0.1"
+ }
+ },
"node_modules/rollup": {
- "version": "3.29.5",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.5.tgz",
- "integrity": "sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==",
+ "version": "4.44.0",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.44.0.tgz",
+ "integrity": "sha512-qHcdEzLCiktQIfwBq420pn2dP+30uzqYxv9ETm91wdt2R9AFcWfjNAmje4NWlnCIQ5RMTzVf0ZyisOKqHR6RwA==",
"license": "MIT",
+ "dependencies": {
+ "@types/estree": "1.0.8"
+ },
"bin": {
"rollup": "dist/bin/rollup"
},
"engines": {
- "node": ">=14.18.0",
+ "node": ">=18.0.0",
"npm": ">=8.0.0"
},
"optionalDependencies": {
+ "@rollup/rollup-android-arm-eabi": "4.44.0",
+ "@rollup/rollup-android-arm64": "4.44.0",
+ "@rollup/rollup-darwin-arm64": "4.44.0",
+ "@rollup/rollup-darwin-x64": "4.44.0",
+ "@rollup/rollup-freebsd-arm64": "4.44.0",
+ "@rollup/rollup-freebsd-x64": "4.44.0",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.44.0",
+ "@rollup/rollup-linux-arm-musleabihf": "4.44.0",
+ "@rollup/rollup-linux-arm64-gnu": "4.44.0",
+ "@rollup/rollup-linux-arm64-musl": "4.44.0",
+ "@rollup/rollup-linux-loongarch64-gnu": "4.44.0",
+ "@rollup/rollup-linux-powerpc64le-gnu": "4.44.0",
+ "@rollup/rollup-linux-riscv64-gnu": "4.44.0",
+ "@rollup/rollup-linux-riscv64-musl": "4.44.0",
+ "@rollup/rollup-linux-s390x-gnu": "4.44.0",
+ "@rollup/rollup-linux-x64-gnu": "4.44.0",
+ "@rollup/rollup-linux-x64-musl": "4.44.0",
+ "@rollup/rollup-win32-arm64-msvc": "4.44.0",
+ "@rollup/rollup-win32-ia32-msvc": "4.44.0",
+ "@rollup/rollup-win32-x64-msvc": "4.44.0",
"fsevents": "~2.3.2"
}
},
"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",
@@ -15673,18 +17494,17 @@
}
},
"node_modules/rxjs": {
- "version": "7.8.1",
- "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz",
- "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==",
- "dev": true,
+ "version": "7.8.2",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz",
+ "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==",
+ "license": "Apache-2.0",
"dependencies": {
"tslib": "^2.1.0"
}
},
"node_modules/sade": {
"version": "1.8.1",
- "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz",
- "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==",
+ "license": "MIT",
"dependencies": {
"mri": "^1.1.0"
},
@@ -15694,8 +17514,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",
@@ -15709,26 +17527,42 @@
"type": "consulting",
"url": "https://feross.org/support"
}
- ]
+ ],
+ "license": "MIT"
+ },
+ "node_modules/safe-regex-test": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz",
+ "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "is-regex": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
},
"node_modules/safer-buffer": {
"version": "2.1.2",
- "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
- "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+ "license": "MIT"
},
"node_modules/scheduler": {
"version": "0.23.0",
- "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz",
- "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==",
+ "license": "MIT",
"dependencies": {
"loose-envify": "^1.1.0"
}
},
"node_modules/schema-utils": {
"version": "3.3.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
- "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@types/json-schema": "^7.0.8",
"ajv": "^6.12.5",
@@ -15744,16 +17578,13 @@
},
"node_modules/semver": {
"version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "license": "ISC",
"bin": {
"semver": "bin/semver.js"
}
},
"node_modules/send": {
"version": "0.19.0",
- "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz",
- "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==",
"license": "MIT",
"dependencies": {
"debug": "2.6.9",
@@ -15776,8 +17607,6 @@
},
"node_modules/send/node_modules/debug": {
"version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"license": "MIT",
"dependencies": {
"ms": "2.0.0"
@@ -15785,14 +17614,10 @@
},
"node_modules/send/node_modules/debug/node_modules/ms": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
"license": "MIT"
},
"node_modules/send/node_modules/encodeurl": {
"version": "1.0.2",
- "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
- "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
"license": "MIT",
"engines": {
"node": ">= 0.8"
@@ -15800,8 +17625,6 @@
},
"node_modules/send/node_modules/mime": {
"version": "1.6.0",
- "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
- "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
"license": "MIT",
"bin": {
"mime": "cli.js"
@@ -15812,24 +17635,21 @@
},
"node_modules/send/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==",
"license": "MIT"
},
"node_modules/serialize-error": {
"version": "2.1.0",
- "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz",
- "integrity": "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/serialize-javascript": {
"version": "6.0.2",
- "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
- "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==",
"dev": true,
+ "license": "BSD-3-Clause",
"peer": true,
"dependencies": {
"randombytes": "^2.1.0"
@@ -15837,8 +17657,6 @@
},
"node_modules/serve-static": {
"version": "1.16.2",
- "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz",
- "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==",
"license": "MIT",
"dependencies": {
"encodeurl": "~2.0.0",
@@ -15852,21 +17670,23 @@
},
"node_modules/set-blocking": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
- "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==",
- "license": "ISC"
+ "license": "ISC",
+ "optional": true,
+ "peer": true
},
"node_modules/set-function-length": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz",
- "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==",
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
+ "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "define-data-property": "^1.1.2",
+ "define-data-property": "^1.1.4",
"es-errors": "^1.3.0",
"function-bind": "^1.1.2",
- "get-intrinsic": "^1.2.3",
+ "get-intrinsic": "^1.2.4",
"gopd": "^1.0.1",
- "has-property-descriptors": "^1.0.1"
+ "has-property-descriptors": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
@@ -15874,9 +17694,8 @@
},
"node_modules/set-function-name": {
"version": "2.0.1",
- "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz",
- "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"define-data-property": "^1.0.1",
"functions-have-names": "^1.2.3",
@@ -15886,15 +17705,35 @@
"node": ">= 0.4"
}
},
+ "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,
+ "license": "MIT"
+ },
"node_modules/setprototypeof": {
"version": "1.2.0",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
- "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
+ "license": "ISC"
+ },
+ "node_modules/sha.js": {
+ "version": "2.4.11",
+ "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
+ "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
+ "dev": true,
+ "license": "(MIT AND BSD-3-Clause)",
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ },
+ "bin": {
+ "sha.js": "bin.js"
+ }
},
"node_modules/shallow-clone": {
"version": "3.0.1",
- "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
- "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
+ "devOptional": true,
+ "license": "MIT",
"dependencies": {
"kind-of": "^6.0.2"
},
@@ -15904,8 +17743,7 @@
},
"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==",
+ "license": "MIT",
"dependencies": {
"shebang-regex": "^3.0.0"
},
@@ -15915,30 +17753,82 @@
},
"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==",
+ "license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/shell-quote": {
"version": "1.8.1",
- "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz",
- "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==",
+ "license": "MIT",
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/side-channel": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
- "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
+ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
"license": "MIT",
"dependencies": {
- "call-bind": "^1.0.7",
"es-errors": "^1.3.0",
- "get-intrinsic": "^1.2.4",
- "object-inspect": "^1.13.1"
+ "object-inspect": "^1.13.3",
+ "side-channel-list": "^1.0.0",
+ "side-channel-map": "^1.0.1",
+ "side-channel-weakmap": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-list": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
+ "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-map": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-weakmap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3",
+ "side-channel-map": "^1.0.1"
},
"engines": {
"node": ">= 0.4"
@@ -15949,14 +17839,13 @@
},
"node_modules/signal-exit": {
"version": "3.0.7",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
- "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="
+ "devOptional": true,
+ "license": "ISC"
},
"node_modules/simple-update-notifier": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz",
- "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"semver": "^7.5.3"
},
@@ -15966,9 +17855,8 @@
},
"node_modules/simple-update-notifier/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,
+ "license": "ISC",
"dependencies": {
"yallist": "^4.0.0"
},
@@ -15978,9 +17866,8 @@
},
"node_modules/simple-update-notifier/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,
+ "license": "ISC",
"dependencies": {
"lru-cache": "^6.0.0"
},
@@ -15993,29 +17880,29 @@
},
"node_modules/simple-update-notifier/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
+ "dev": true,
+ "license": "ISC"
},
"node_modules/sisteransi": {
"version": "1.0.5",
- "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
- "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
- "license": "MIT"
+ "license": "MIT",
+ "optional": true,
+ "peer": true
},
"node_modules/slash": {
"version": "3.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
- "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"engines": {
"node": ">=8"
}
},
"node_modules/slice-ansi": {
"version": "2.1.0",
- "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz",
- "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"ansi-styles": "^3.2.0",
"astral-regex": "^1.0.0",
@@ -16027,8 +17914,8 @@
},
"node_modules/snake-case": {
"version": "3.0.4",
- "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz",
- "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
"dot-case": "^3.0.4",
"tslib": "^2.0.3"
@@ -16036,15 +17923,12 @@
},
"node_modules/sorted-array-functions": {
"version": "1.3.0",
- "resolved": "https://registry.npmjs.org/sorted-array-functions/-/sorted-array-functions-1.3.0.tgz",
- "integrity": "sha512-2sqgzeFlid6N4Z2fUQ1cvFmTOLRi/sEDzSQ0OKYchqgoPmQBVyM3959qYx3fpS6Esef80KjmpgPeEr028dP3OA==",
"license": "MIT"
},
"node_modules/sortobject": {
"version": "4.17.0",
- "resolved": "https://registry.npmjs.org/sortobject/-/sortobject-4.17.0.tgz",
- "integrity": "sha512-gzx7USv55AFRQ7UCWJHHauwD/ptUHF9MLXCGO3f5M9zauDPZ/4a9H6/VVbOXefdpEoI1unwB/bArHIVMbWBHmA==",
"dev": true,
+ "license": "Artistic-2.0",
"engines": {
"node": ">=10"
},
@@ -16054,16 +17938,13 @@
},
"node_modules/source-map": {
"version": "0.5.7",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
- "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
+ "license": "BSD-3-Clause",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/source-map-js": {
"version": "1.2.1",
- "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
- "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
"license": "BSD-3-Clause",
"engines": {
"node": ">=0.10.0"
@@ -16071,8 +17952,9 @@
},
"node_modules/source-map-support": {
"version": "0.5.21",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
- "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+ "devOptional": true,
+ "license": "MIT",
+ "peer": true,
"dependencies": {
"buffer-from": "^1.0.0",
"source-map": "^0.6.0"
@@ -16080,42 +17962,89 @@
},
"node_modules/source-map-support/node_modules/source-map": {
"version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "devOptional": true,
+ "license": "BSD-3-Clause",
+ "peer": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/space-separated-tokens": {
"version": "2.0.2",
- "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz",
- "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==",
+ "license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/wooorm"
}
},
"node_modules/spawn-command": {
- "version": "0.0.2-1",
- "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz",
- "integrity": "sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==",
- "dev": true
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz",
+ "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ=="
+ },
+ "node_modules/speech-rule-engine": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/speech-rule-engine/-/speech-rule-engine-4.1.2.tgz",
+ "integrity": "sha512-S6ji+flMEga+1QU79NDbwZ8Ivf0S/MpupQQiIC0rTpU/ZTKgcajijJJb1OcByBQDjrXCN1/DJtGz4ZJeBMPGJw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@xmldom/xmldom": "0.9.8",
+ "commander": "13.1.0",
+ "wicked-good-xpath": "1.3.0"
+ },
+ "bin": {
+ "sre": "bin/sre"
+ }
+ },
+ "node_modules/speech-rule-engine/node_modules/commander": {
+ "version": "13.1.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz",
+ "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
},
"node_modules/split.js": {
"version": "1.6.5",
- "resolved": "https://registry.npmjs.org/split.js/-/split.js-1.6.5.tgz",
- "integrity": "sha512-mPTnGCiS/RiuTNsVhCm9De9cCAUsrNFFviRbADdKiiV+Kk8HKp/0fWu7Kr8pi3/yBmsqLFHuXGT9UUZ+CNLwFw=="
+ "license": "MIT"
},
"node_modules/sprintf-js": {
"version": "1.0.3",
- "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
- "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
- "license": "BSD-3-Clause"
+ "license": "BSD-3-Clause",
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/sshpk": {
+ "version": "1.18.0",
+ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz",
+ "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==",
+ "license": "MIT",
+ "dependencies": {
+ "asn1": "~0.2.3",
+ "assert-plus": "^1.0.0",
+ "bcrypt-pbkdf": "^1.0.0",
+ "dashdash": "^1.12.0",
+ "ecc-jsbn": "~0.1.1",
+ "getpass": "^0.1.1",
+ "jsbn": "~0.1.0",
+ "safer-buffer": "^2.0.2",
+ "tweetnacl": "~0.14.0"
+ },
+ "bin": {
+ "sshpk-conv": "bin/sshpk-conv",
+ "sshpk-sign": "bin/sshpk-sign",
+ "sshpk-verify": "bin/sshpk-verify"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
"node_modules/stack-utils": {
"version": "2.0.6",
- "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz",
- "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"escape-string-regexp": "^2.0.0"
},
@@ -16125,21 +18054,23 @@
},
"node_modules/stack-utils/node_modules/escape-string-regexp": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
- "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"engines": {
"node": ">=8"
}
},
"node_modules/stackframe": {
"version": "1.3.4",
- "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz",
- "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw=="
+ "devOptional": true,
+ "license": "MIT"
},
"node_modules/stacktrace-parser": {
"version": "0.1.10",
- "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz",
- "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"type-fest": "^0.7.1"
},
@@ -16149,25 +18080,24 @@
},
"node_modules/stacktrace-parser/node_modules/type-fest": {
"version": "0.7.1",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz",
- "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==",
+ "license": "(MIT OR CC0-1.0)",
+ "optional": true,
+ "peer": true,
"engines": {
"node": ">=8"
}
},
"node_modules/statuses": {
"version": "2.0.1",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
- "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
+ "license": "MIT",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/stop-iteration-iterator": {
"version": "1.0.0",
- "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz",
- "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"internal-slot": "^1.0.4"
},
@@ -16175,19 +18105,28 @@
"node": ">= 0.4"
}
},
+ "node_modules/stream-browserify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz",
+ "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "~2.0.4",
+ "readable-stream": "^3.5.0"
+ }
+ },
"node_modules/stream-composer": {
"version": "1.0.2",
- "resolved": "https://registry.npmjs.org/stream-composer/-/stream-composer-1.0.2.tgz",
- "integrity": "sha512-bnBselmwfX5K10AH6L4c8+S5lgZMWI7ZYrz2rvYjCPB2DIMC4Ig8OpxGpNJSxRZ58oti7y1IcNvjBAz9vW5m4w==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"streamx": "^2.13.2"
}
},
"node_modules/stream-http": {
"version": "3.2.0",
- "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz",
- "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==",
+ "license": "MIT",
"dependencies": {
"builtin-status-codes": "^3.0.0",
"inherits": "^2.0.4",
@@ -16197,9 +18136,8 @@
},
"node_modules/streamx": {
"version": "2.16.1",
- "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.16.1.tgz",
- "integrity": "sha512-m9QYj6WygWyWa3H1YY69amr4nVgy61xfjys7xO7kviL5rfIEc2naf+ewFiOA+aEJD7y0JO3h2GoiUv4TDwEGzQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"fast-fifo": "^1.1.0",
"queue-tick": "^1.0.1"
@@ -16210,16 +18148,14 @@
},
"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==",
+ "license": "MIT",
"dependencies": {
"safe-buffer": "~5.2.0"
}
},
"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==",
+ "license": "MIT",
"dependencies": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
@@ -16231,16 +18167,14 @@
},
"node_modules/string-width/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==",
+ "license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/string-width/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==",
+ "license": "MIT",
"dependencies": {
"ansi-regex": "^5.0.1"
},
@@ -16250,9 +18184,9 @@
},
"node_modules/strip-ansi": {
"version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"ansi-regex": "^4.1.0"
},
@@ -16262,17 +18196,16 @@
},
"node_modules/strip-ansi/node_modules/ansi-regex": {
"version": "4.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
- "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"engines": {
"node": ">=6"
}
},
"node_modules/strip-final-newline": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
- "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+ "devOptional": true,
"license": "MIT",
"engines": {
"node": ">=6"
@@ -16280,15 +18213,14 @@
},
"node_modules/strnum": {
"version": "1.0.5",
- "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz",
- "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==",
- "license": "MIT"
+ "license": "MIT",
+ "optional": true,
+ "peer": true
},
"node_modules/style-loader": {
"version": "3.3.4",
- "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz",
- "integrity": "sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">= 12.13.0"
},
@@ -16302,28 +18234,25 @@
},
"node_modules/style-to-object": {
"version": "0.4.4",
- "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz",
- "integrity": "sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==",
+ "license": "MIT",
"dependencies": {
"inline-style-parser": "0.1.1"
}
},
"node_modules/stylis": {
"version": "4.2.0",
- "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz",
- "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw=="
+ "license": "MIT"
},
"node_modules/sudo-prompt": {
"version": "9.2.1",
- "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.2.1.tgz",
- "integrity": "sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==",
- "license": "MIT"
+ "license": "MIT",
+ "optional": true,
+ "peer": true
},
"node_modules/supports-color": {
"version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"has-flag": "^3.0.0"
},
@@ -16333,8 +18262,7 @@
},
"node_modules/supports-preserve-symlinks-flag": {
"version": "1.0.0",
- "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
- "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "license": "MIT",
"engines": {
"node": ">= 0.4"
},
@@ -16344,36 +18272,40 @@
},
"node_modules/svg-parser": {
"version": "2.0.4",
- "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz",
- "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ=="
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/tabbable": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz",
+ "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==",
+ "license": "MIT"
},
"node_modules/tachyons": {
"version": "4.12.0",
- "resolved": "https://registry.npmjs.org/tachyons/-/tachyons-4.12.0.tgz",
- "integrity": "sha512-2nA2IrYFy3raCM9fxJ2KODRGHVSZNTW3BR0YnlGsLUf1DA3pk3YfWZ/DdfbnZK6zLZS+jUenlUGJsKcA5fUiZg=="
+ "license": "MIT"
},
"node_modules/tapable": {
"version": "2.2.1",
- "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
- "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/teex": {
"version": "1.0.1",
- "resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz",
- "integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"streamx": "^2.12.5"
}
},
"node_modules/temp": {
"version": "0.8.4",
- "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.4.tgz",
- "integrity": "sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"rimraf": "~2.6.2"
},
@@ -16383,8 +18315,9 @@
},
"node_modules/temp/node_modules/rimraf": {
"version": "2.6.3",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
- "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
+ "license": "ISC",
+ "optional": true,
+ "peer": true,
"dependencies": {
"glob": "^7.1.3"
},
@@ -16394,8 +18327,9 @@
},
"node_modules/terser": {
"version": "5.27.0",
- "resolved": "https://registry.npmjs.org/terser/-/terser-5.27.0.tgz",
- "integrity": "sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A==",
+ "devOptional": true,
+ "license": "BSD-2-Clause",
+ "peer": true,
"dependencies": {
"@jridgewell/source-map": "^0.3.3",
"acorn": "^8.8.2",
@@ -16411,9 +18345,8 @@
},
"node_modules/terser-webpack-plugin": {
"version": "5.3.10",
- "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz",
- "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==",
"dev": true,
+ "license": "MIT",
"peer": true,
"dependencies": {
"@jridgewell/trace-mapping": "^0.3.20",
@@ -16446,19 +18379,48 @@
},
"node_modules/terser/node_modules/commander": {
"version": "2.20.3",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
- "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
+ "devOptional": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/thingies": {
+ "version": "1.21.0",
+ "resolved": "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz",
+ "integrity": "sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==",
+ "license": "Unlicense",
+ "engines": {
+ "node": ">=10.18"
+ },
+ "peerDependencies": {
+ "tslib": "^2"
+ }
},
"node_modules/throat": {
"version": "5.0.0",
- "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz",
- "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/throttleit": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.1.tgz",
+ "integrity": "sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
+ "dev": true,
"license": "MIT"
},
"node_modules/through2": {
"version": "2.0.5",
- "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
- "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
+ "devOptional": true,
+ "license": "MIT",
"dependencies": {
"readable-stream": "~2.3.6",
"xtend": "~4.0.1"
@@ -16466,13 +18428,13 @@
},
"node_modules/through2/node_modules/isarray": {
"version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
+ "devOptional": true,
+ "license": "MIT"
},
"node_modules/through2/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==",
+ "devOptional": true,
+ "license": "MIT",
"dependencies": {
"core-util-is": "~1.0.0",
"inherits": "~2.0.3",
@@ -16485,21 +18447,32 @@
},
"node_modules/through2/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=="
+ "devOptional": true,
+ "license": "MIT"
},
"node_modules/through2/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==",
+ "devOptional": true,
+ "license": "MIT",
"dependencies": {
"safe-buffer": "~5.1.0"
}
},
+ "node_modules/timers-browserify": {
+ "version": "2.0.12",
+ "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz",
+ "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "setimmediate": "^1.0.4"
+ },
+ "engines": {
+ "node": ">=0.6.0"
+ }
+ },
"node_modules/tinyglobby": {
"version": "0.2.13",
- "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz",
- "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==",
"license": "MIT",
"dependencies": {
"fdir": "^6.4.4",
@@ -16514,8 +18487,6 @@
},
"node_modules/tinyglobby/node_modules/fdir": {
"version": "6.4.4",
- "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz",
- "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==",
"license": "MIT",
"peerDependencies": {
"picomatch": "^3 || ^4"
@@ -16528,8 +18499,6 @@
},
"node_modules/tinyglobby/node_modules/picomatch": {
"version": "4.0.2",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz",
- "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
"license": "MIT",
"engines": {
"node": ">=12"
@@ -16538,16 +18507,45 @@
"url": "https://github.com/sponsors/jonschlinkert"
}
},
+ "node_modules/tldts": {
+ "version": "6.1.86",
+ "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz",
+ "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tldts-core": "^6.1.86"
+ },
+ "bin": {
+ "tldts": "bin/cli.js"
+ }
+ },
+ "node_modules/tldts-core": {
+ "version": "6.1.86",
+ "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz",
+ "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/tmp": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz",
+ "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.14"
+ }
+ },
"node_modules/tmpl": {
"version": "1.0.5",
- "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
- "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==",
- "license": "BSD-3-Clause"
+ "license": "BSD-3-Clause",
+ "optional": true,
+ "peer": 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==",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"is-number": "^7.0.0"
@@ -16558,9 +18556,8 @@
},
"node_modules/to-through": {
"version": "3.0.0",
- "resolved": "https://registry.npmjs.org/to-through/-/to-through-3.0.0.tgz",
- "integrity": "sha512-y8MN937s/HVhEoBU1SxfHC+wxCHkV1a9gW8eAdTadYh/bGyesZIVcbjI+mSpFbSVwQici/XjBjuUyri1dnXwBw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"streamx": "^2.12.5"
},
@@ -16570,8 +18567,6 @@
},
"node_modules/toad-cache": {
"version": "3.7.0",
- "resolved": "https://registry.npmjs.org/toad-cache/-/toad-cache-3.7.0.tgz",
- "integrity": "sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==",
"license": "MIT",
"engines": {
"node": ">=12"
@@ -16579,17 +18574,15 @@
},
"node_modules/toidentifier": {
"version": "1.0.1",
- "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
- "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
+ "license": "MIT",
"engines": {
"node": ">=0.6"
}
},
"node_modules/touch": {
"version": "3.1.0",
- "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz",
- "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==",
"dev": true,
+ "license": "ISC",
"dependencies": {
"nopt": "~1.0.10"
},
@@ -16597,24 +18590,49 @@
"nodetouch": "bin/nodetouch.js"
}
},
+ "node_modules/tough-cookie": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz",
+ "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "tldts": "^6.1.32"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
"node_modules/tr46": {
"version": "0.0.3",
- "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
- "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
+ "license": "MIT"
+ },
+ "node_modules/tree-dump": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.3.tgz",
+ "integrity": "sha512-il+Cv80yVHFBwokQSfd4bldvr1Md951DpgAGfmhydt04L+YzHgubm2tQ7zueWDcGENKHq0ZvGFR/hjvNXilHEg==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=10.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/streamich"
+ },
+ "peerDependencies": {
+ "tslib": "2"
+ }
},
"node_modules/tree-kill": {
"version": "1.2.2",
- "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
- "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
- "dev": true,
+ "license": "MIT",
"bin": {
"tree-kill": "cli.js"
}
},
"node_modules/trim-lines": {
"version": "3.0.1",
- "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz",
- "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==",
+ "license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/wooorm"
@@ -16622,8 +18640,7 @@
},
"node_modules/trough": {
"version": "2.2.0",
- "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz",
- "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==",
+ "license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/wooorm"
@@ -16631,9 +18648,8 @@
},
"node_modules/ts-loader": {
"version": "9.5.1",
- "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.1.tgz",
- "integrity": "sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"chalk": "^4.1.0",
"enhanced-resolve": "^5.0.0",
@@ -16649,69 +18665,10 @@
"webpack": "^5.0.0"
}
},
- "node_modules/ts-loader/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/ts-loader/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/ts-loader/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/ts-loader/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/ts-loader/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/ts-loader/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,
+ "license": "ISC",
"dependencies": {
"yallist": "^4.0.0"
},
@@ -16721,9 +18678,8 @@
},
"node_modules/ts-loader/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,
+ "license": "ISC",
"dependencies": {
"lru-cache": "^6.0.0"
},
@@ -16736,48 +18692,57 @@
},
"node_modules/ts-loader/node_modules/source-map": {
"version": "0.7.4",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
- "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==",
"dev": true,
+ "license": "BSD-3-Clause",
"engines": {
"node": ">= 8"
}
},
- "node_modules/ts-loader/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==",
+ "node_modules/ts-loader/node_modules/yallist": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/tslib": {
+ "version": "2.6.2",
+ "license": "0BSD"
+ },
+ "node_modules/tty-browserify": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz",
+ "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==",
"dev": true,
+ "license": "MIT"
+ },
+ "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==",
+ "license": "Apache-2.0",
"dependencies": {
- "has-flag": "^4.0.0"
+ "safe-buffer": "^5.0.1"
},
"engines": {
- "node": ">=8"
- }
- },
- "node_modules/ts-loader/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": "*"
+ }
},
- "node_modules/tslib": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
- "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="
+ "node_modules/tweetnacl": {
+ "version": "0.14.5",
+ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+ "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==",
+ "license": "Unlicense"
},
"node_modules/type-detect": {
"version": "4.0.8",
- "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
- "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"engines": {
"node": ">=4"
}
},
"node_modules/type-fest": {
"version": "4.37.0",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.37.0.tgz",
- "integrity": "sha512-S/5/0kFftkq27FPNye0XM1e2NsnoD/3FS+pBmbjmmtLT6I+i344KoOf7pvXreaFsDamWeaJX55nczA1m5PsBDg==",
"license": "(MIT OR CC0-1.0)",
"engines": {
"node": ">=16"
@@ -16788,8 +18753,6 @@
},
"node_modules/type-is": {
"version": "1.6.18",
- "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
- "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
"license": "MIT",
"dependencies": {
"media-typer": "0.3.0",
@@ -16801,9 +18764,9 @@
},
"node_modules/typescript": {
"version": "4.9.5",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz",
- "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==",
- "devOptional": true,
+ "dev": true,
+ "license": "Apache-2.0",
+ "peer": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
@@ -16814,10 +18777,9 @@
},
"node_modules/uglify-es": {
"version": "3.3.10",
- "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.10.tgz",
- "integrity": "sha512-rPzPisCzW68Okj1zNrfa2dR9uEm43SevDmpR6FChoZABFk9dANGnzzBMgHYUXI3609//63fnVkyQ1SQmAMyjww==",
- "deprecated": "support for ECMAScript is superseded by `uglify-js` as of v3.13.0",
"license": "BSD-2-Clause",
+ "optional": true,
+ "peer": true,
"dependencies": {
"commander": "~2.14.1",
"source-map": "~0.6.1"
@@ -16831,42 +18793,51 @@
},
"node_modules/uglify-es/node_modules/commander": {
"version": "2.14.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.14.1.tgz",
- "integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw==",
- "license": "MIT"
+ "license": "MIT",
+ "optional": true,
+ "peer": true
},
"node_modules/uglify-es/node_modules/source-map": {
"version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"license": "BSD-3-Clause",
+ "optional": true,
+ "peer": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/undefsafe": {
"version": "2.0.5",
- "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz",
- "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/undici": {
+ "version": "7.10.0",
+ "resolved": "https://registry.npmjs.org/undici/-/undici-7.10.0.tgz",
+ "integrity": "sha512-u5otvFBOBZvmdjWLVW+5DAc9Nkq8f24g0O9oY7qw2JVIF1VocIFoyz9JFkuVOS2j41AufeO0xnlweJ2RLT8nGw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=20.18.1"
+ }
},
"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=="
+ "license": "MIT"
},
"node_modules/unicode-canonical-property-names-ecmascript": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz",
- "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"engines": {
"node": ">=4"
}
},
"node_modules/unicode-match-property-ecmascript": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz",
- "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"unicode-canonical-property-names-ecmascript": "^2.0.0",
"unicode-property-aliases-ecmascript": "^2.0.0"
@@ -16877,24 +18848,25 @@
},
"node_modules/unicode-match-property-value-ecmascript": {
"version": "2.1.0",
- "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz",
- "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"engines": {
"node": ">=4"
}
},
"node_modules/unicode-property-aliases-ecmascript": {
"version": "2.1.0",
- "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz",
- "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"engines": {
"node": ">=4"
}
},
"node_modules/unified": {
"version": "10.1.2",
- "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz",
- "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==",
+ "license": "MIT",
"dependencies": {
"@types/unist": "^2.0.0",
"bail": "^2.0.0",
@@ -16911,8 +18883,7 @@
},
"node_modules/unist-util-find-after": {
"version": "4.0.1",
- "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-4.0.1.tgz",
- "integrity": "sha512-QO/PuPMm2ERxC6vFXEPtmAutOopy5PknD+Oq64gGwxKtk4xwo9Z97t9Av1obPmGU0IyTa6EKYUfTrK2QJS3Ozw==",
+ "license": "MIT",
"dependencies": {
"@types/unist": "^2.0.0",
"unist-util-is": "^5.0.0"
@@ -16924,8 +18895,7 @@
},
"node_modules/unist-util-generated": {
"version": "2.0.1",
- "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-2.0.1.tgz",
- "integrity": "sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==",
+ "license": "MIT",
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
@@ -16933,8 +18903,7 @@
},
"node_modules/unist-util-is": {
"version": "5.2.1",
- "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz",
- "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==",
+ "license": "MIT",
"dependencies": {
"@types/unist": "^2.0.0"
},
@@ -16945,8 +18914,7 @@
},
"node_modules/unist-util-position": {
"version": "4.0.4",
- "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz",
- "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==",
+ "license": "MIT",
"dependencies": {
"@types/unist": "^2.0.0"
},
@@ -16957,8 +18925,7 @@
},
"node_modules/unist-util-remove-position": {
"version": "4.0.2",
- "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-4.0.2.tgz",
- "integrity": "sha512-TkBb0HABNmxzAcfLf4qsIbFbaPDvMO6wa3b3j4VcEzFVaw1LBKwnW4/sRJ/atSLSzoIg41JWEdnE7N6DIhGDGQ==",
+ "license": "MIT",
"dependencies": {
"@types/unist": "^2.0.0",
"unist-util-visit": "^4.0.0"
@@ -16970,8 +18937,7 @@
},
"node_modules/unist-util-stringify-position": {
"version": "3.0.3",
- "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz",
- "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==",
+ "license": "MIT",
"dependencies": {
"@types/unist": "^2.0.0"
},
@@ -16982,8 +18948,7 @@
},
"node_modules/unist-util-visit": {
"version": "4.1.2",
- "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz",
- "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==",
+ "license": "MIT",
"dependencies": {
"@types/unist": "^2.0.0",
"unist-util-is": "^5.0.0",
@@ -16996,8 +18961,7 @@
},
"node_modules/unist-util-visit-parents": {
"version": "5.1.3",
- "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz",
- "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==",
+ "license": "MIT",
"dependencies": {
"@types/unist": "^2.0.0",
"unist-util-is": "^5.0.0"
@@ -17009,38 +18973,40 @@
},
"node_modules/universal-github-app-jwt": {
"version": "2.2.0",
- "resolved": "https://registry.npmjs.org/universal-github-app-jwt/-/universal-github-app-jwt-2.2.0.tgz",
- "integrity": "sha512-G5o6f95b5BggDGuUfKDApKaCgNYy2x7OdHY0zSMF081O0EJobw+1130VONhrA7ezGSV2FNOGyM+KQpQZAr9bIQ==",
"license": "MIT"
},
"node_modules/universal-user-agent": {
"version": "7.0.2",
- "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.2.tgz",
- "integrity": "sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==",
"license": "ISC"
},
"node_modules/universalify": {
"version": "0.1.2",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
- "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"engines": {
"node": ">= 4.0.0"
}
},
"node_modules/unpipe": {
"version": "1.0.0",
- "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
- "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
"license": "MIT",
"engines": {
"node": ">= 0.8"
}
},
+ "node_modules/untildify": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz",
+ "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/update-browserslist-db": {
"version": "1.1.1",
- "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz",
- "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==",
"funding": [
{
"type": "opencollective",
@@ -17069,18 +19035,29 @@
},
"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,
+ "license": "BSD-2-Clause",
"dependencies": {
"punycode": "^2.1.0"
}
},
+ "node_modules/url": {
+ "version": "0.11.4",
+ "resolved": "https://registry.npmjs.org/url/-/url-0.11.4.tgz",
+ "integrity": "sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "punycode": "^1.4.1",
+ "qs": "^6.12.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/url-loader": {
"version": "4.1.1",
- "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz",
- "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"loader-utils": "^2.0.0",
"mime-types": "^2.1.27",
@@ -17103,31 +19080,47 @@
}
}
},
+ "node_modules/url/node_modules/punycode": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+ "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/use-sync-external-store": {
"version": "1.2.0",
- "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz",
- "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==",
+ "license": "MIT",
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0 || ^18.0.0"
}
},
+ "node_modules/util": {
+ "version": "0.12.5",
+ "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz",
+ "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "is-arguments": "^1.0.4",
+ "is-generator-function": "^1.0.7",
+ "is-typed-array": "^1.1.3",
+ "which-typed-array": "^1.1.2"
+ }
+ },
"node_modules/util-deprecate": {
"version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
+ "license": "MIT"
},
"node_modules/utils-merge": {
"version": "1.0.1",
- "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
- "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
+ "license": "MIT",
"engines": {
"node": ">= 0.4.0"
}
},
"node_modules/uuid": {
"version": "11.1.0",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz",
- "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==",
"funding": [
"https://github.com/sponsors/broofa",
"https://github.com/sponsors/ctavan"
@@ -17139,8 +19132,7 @@
},
"node_modules/uvu": {
"version": "0.5.6",
- "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz",
- "integrity": "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==",
+ "license": "MIT",
"dependencies": {
"dequal": "^2.0.0",
"diff": "^5.0.0",
@@ -17156,33 +19148,43 @@
},
"node_modules/uvu/node_modules/kleur": {
"version": "4.1.5",
- "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz",
- "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==",
+ "license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/value-or-function": {
"version": "4.0.0",
- "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-4.0.0.tgz",
- "integrity": "sha512-aeVK81SIuT6aMJfNo9Vte8Dw0/FZINGBV8BfCraGtqVxIeLAEhJyoWs8SmvRVmXfGss2PmmOwZCuBPbZR+IYWg==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">= 10.13.0"
}
},
"node_modules/vary": {
"version": "1.1.2",
- "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
- "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
+ "license": "MIT",
"engines": {
"node": ">= 0.8"
}
},
+ "node_modules/verror": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
+ "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==",
+ "engines": [
+ "node >=0.6.0"
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "assert-plus": "^1.0.0",
+ "core-util-is": "1.0.2",
+ "extsprintf": "^1.2.0"
+ }
+ },
"node_modules/vfile": {
"version": "5.3.7",
- "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz",
- "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==",
+ "license": "MIT",
"dependencies": {
"@types/unist": "^2.0.0",
"is-buffer": "^2.0.0",
@@ -17196,8 +19198,7 @@
},
"node_modules/vfile-location": {
"version": "4.1.0",
- "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-4.1.0.tgz",
- "integrity": "sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==",
+ "license": "MIT",
"dependencies": {
"@types/unist": "^2.0.0",
"vfile": "^5.0.0"
@@ -17209,8 +19210,7 @@
},
"node_modules/vfile-message": {
"version": "3.1.4",
- "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz",
- "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==",
+ "license": "MIT",
"dependencies": {
"@types/unist": "^2.0.0",
"unist-util-stringify-position": "^3.0.0"
@@ -17222,9 +19222,8 @@
},
"node_modules/vinyl": {
"version": "3.0.0",
- "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-3.0.0.tgz",
- "integrity": "sha512-rC2VRfAVVCGEgjnxHUnpIVh3AGuk62rP3tqVrn+yab0YH7UULisC085+NYH+mnqf3Wx4SpSi1RQMwudL89N03g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"clone": "^2.1.2",
"clone-stats": "^1.0.0",
@@ -17238,9 +19237,8 @@
},
"node_modules/vinyl-contents": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/vinyl-contents/-/vinyl-contents-2.0.0.tgz",
- "integrity": "sha512-cHq6NnGyi2pZ7xwdHSW1v4Jfnho4TEGtxZHw01cmnc8+i7jgR6bRnED/LbrKan/Q7CvVLbnvA5OepnhbpjBZ5Q==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"bl": "^5.0.0",
"vinyl": "^3.0.0"
@@ -17251,9 +19249,8 @@
},
"node_modules/vinyl-contents/node_modules/bl": {
"version": "5.1.0",
- "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz",
- "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"buffer": "^6.0.3",
"inherits": "^2.0.4",
@@ -17262,8 +19259,6 @@
},
"node_modules/vinyl-contents/node_modules/buffer": {
"version": "6.0.3",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
- "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
"dev": true,
"funding": [
{
@@ -17279,6 +19274,7 @@
"url": "https://feross.org/support"
}
],
+ "license": "MIT",
"dependencies": {
"base64-js": "^1.3.1",
"ieee754": "^1.2.1"
@@ -17286,9 +19282,8 @@
},
"node_modules/vinyl-fs": {
"version": "4.0.0",
- "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-4.0.0.tgz",
- "integrity": "sha512-7GbgBnYfaquMk3Qu9g22x000vbYkOex32930rBnc3qByw6HfMEAoELjCjoJv4HuEQxHAurT+nvMHm6MnJllFLw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"fs-mkdirp-stream": "^2.0.1",
"glob-stream": "^8.0.0",
@@ -17311,9 +19306,8 @@
},
"node_modules/vinyl-fs/node_modules/iconv-lite": {
"version": "0.6.3",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
- "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"safer-buffer": ">= 2.1.2 < 3.0.0"
},
@@ -17323,9 +19317,8 @@
},
"node_modules/vinyl-sourcemap": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-2.0.0.tgz",
- "integrity": "sha512-BAEvWxbBUXvlNoFQVFVHpybBbjW1r03WhohJzJDSfgrrK5xVYIDTan6xN14DlyImShgDRv2gl9qhM6irVMsV0Q==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"convert-source-map": "^2.0.0",
"graceful-fs": "^4.2.10",
@@ -17340,17 +19333,14 @@
},
"node_modules/vinyl/node_modules/clone": {
"version": "2.1.2",
- "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
- "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=0.8"
}
},
"node_modules/vite": {
"version": "6.3.5",
- "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz",
- "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==",
"license": "MIT",
"dependencies": {
"esbuild": "^0.25.0",
@@ -17421,10 +19411,26 @@
}
}
},
+ "node_modules/vite-plugin-node-polyfills": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/vite-plugin-node-polyfills/-/vite-plugin-node-polyfills-0.23.0.tgz",
+ "integrity": "sha512-4n+Ys+2bKHQohPBKigFlndwWQ5fFKwaGY6muNDMTb0fSQLyBzS+jjUNRZG9sKF0S/Go4ApG6LFnUGopjkILg3w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@rollup/plugin-inject": "^5.0.5",
+ "node-stdlib-browser": "^1.2.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/davidmyersdev"
+ },
+ "peerDependencies": {
+ "vite": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0"
+ }
+ },
"node_modules/vite-plugin-static-copy": {
"version": "2.3.0",
- "resolved": "https://registry.npmjs.org/vite-plugin-static-copy/-/vite-plugin-static-copy-2.3.0.tgz",
- "integrity": "sha512-LLKwhhHetGaCnWz4mas4qqjjguDka6/6b4+SeIohRroj8aCE7QTfiZECfPecslFQkWZ3HdQuq5kOPmWZjNYlKA==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"chokidar": "^3.5.3",
@@ -17442,8 +19448,7 @@
},
"node_modules/vite-plugin-static-copy/node_modules/fs-extra": {
"version": "11.3.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz",
- "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"graceful-fs": "^4.2.0",
@@ -17456,8 +19461,7 @@
},
"node_modules/vite-plugin-static-copy/node_modules/jsonfile": {
"version": "6.1.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
- "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"universalify": "^2.0.0"
@@ -17468,8 +19472,7 @@
},
"node_modules/vite-plugin-static-copy/node_modules/universalify": {
"version": "2.0.1",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
- "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">= 10.0.0"
@@ -17477,8 +19480,7 @@
},
"node_modules/vite-plugin-svgr": {
"version": "4.3.0",
- "resolved": "https://registry.npmjs.org/vite-plugin-svgr/-/vite-plugin-svgr-4.3.0.tgz",
- "integrity": "sha512-Jy9qLB2/PyWklpYy0xk0UU3TlU0t2UMpJXZvf+hWII1lAmRHrOUKi11Uw8N3rxoNk7atZNYO3pR3vI1f7oi+6w==",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@rollup/pluginutils": "^5.1.3",
@@ -17491,8 +19493,6 @@
},
"node_modules/vite/node_modules/fdir": {
"version": "6.4.4",
- "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz",
- "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==",
"license": "MIT",
"peerDependencies": {
"picomatch": "^3 || ^4"
@@ -17505,8 +19505,6 @@
},
"node_modules/vite/node_modules/picomatch": {
"version": "4.0.2",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz",
- "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
"license": "MIT",
"engines": {
"node": ">=12"
@@ -17515,54 +19513,22 @@
"url": "https://github.com/sponsors/jonschlinkert"
}
},
- "node_modules/vite/node_modules/rollup": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.9.tgz",
- "integrity": "sha512-nF5XYqWWp9hx/LrpC8sZvvvmq0TeTjQgaZHYmAgwysT9nh8sWnZhBnM8ZyVbbJFIQBLwHDNoMqsBZBbUo4U8sQ==",
- "license": "MIT",
- "dependencies": {
- "@types/estree": "1.0.6"
- },
- "bin": {
- "rollup": "dist/bin/rollup"
- },
- "engines": {
- "node": ">=18.0.0",
- "npm": ">=8.0.0"
- },
- "optionalDependencies": {
- "@rollup/rollup-android-arm-eabi": "4.34.9",
- "@rollup/rollup-android-arm64": "4.34.9",
- "@rollup/rollup-darwin-arm64": "4.34.9",
- "@rollup/rollup-darwin-x64": "4.34.9",
- "@rollup/rollup-freebsd-arm64": "4.34.9",
- "@rollup/rollup-freebsd-x64": "4.34.9",
- "@rollup/rollup-linux-arm-gnueabihf": "4.34.9",
- "@rollup/rollup-linux-arm-musleabihf": "4.34.9",
- "@rollup/rollup-linux-arm64-gnu": "4.34.9",
- "@rollup/rollup-linux-arm64-musl": "4.34.9",
- "@rollup/rollup-linux-loongarch64-gnu": "4.34.9",
- "@rollup/rollup-linux-powerpc64le-gnu": "4.34.9",
- "@rollup/rollup-linux-riscv64-gnu": "4.34.9",
- "@rollup/rollup-linux-s390x-gnu": "4.34.9",
- "@rollup/rollup-linux-x64-gnu": "4.34.9",
- "@rollup/rollup-linux-x64-musl": "4.34.9",
- "@rollup/rollup-win32-arm64-msvc": "4.34.9",
- "@rollup/rollup-win32-ia32-msvc": "4.34.9",
- "@rollup/rollup-win32-x64-msvc": "4.34.9",
- "fsevents": "~2.3.2"
- }
- },
"node_modules/vlq": {
"version": "1.0.1",
- "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz",
- "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==",
+ "license": "MIT",
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/vm-browserify": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz",
+ "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==",
+ "dev": true,
"license": "MIT"
},
"node_modules/void-elements": {
"version": "3.1.0",
- "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz",
- "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==",
+ "license": "MIT",
"engines": {
"node": ">=0.10.0"
}
@@ -17570,8 +19536,7 @@
"node_modules/vscode": {
"name": "@codingame/monaco-vscode-api",
"version": "1.69.13",
- "resolved": "https://registry.npmjs.org/@codingame/monaco-vscode-api/-/monaco-vscode-api-1.69.13.tgz",
- "integrity": "sha512-7+dQbQ5O8mQhFyUcAiiJkCotNjZUzRxh4NMBKc/BSIFi0jG47bay+jP/+ngsmxHBapjs/xUAPaKSGNnf9WBmAA==",
+ "license": "MIT",
"peerDependencies": {
"monaco-editor": "~0.34.0",
"vscode-oniguruma": "^1.6.2",
@@ -17580,16 +19545,14 @@
},
"node_modules/vscode-jsonrpc": {
"version": "8.0.2",
- "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.0.2.tgz",
- "integrity": "sha512-RY7HwI/ydoC1Wwg4gJ3y6LpU9FJRZAUnTYMXthqhFXXu77ErDd/xkREpGuk4MyYkk4a+XDWAMqe0S3KkelYQEQ==",
+ "license": "MIT",
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/vscode-languageclient": {
"version": "8.0.2",
- "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-8.0.2.tgz",
- "integrity": "sha512-lHlthJtphG9gibGb/y72CKqQUxwPsMXijJVpHEC2bvbFqxmkj9LwQ3aGU9dwjBLqsX1S4KjShYppLvg1UJDF/Q==",
+ "license": "MIT",
"dependencies": {
"minimatch": "^3.0.4",
"semver": "^7.3.5",
@@ -17601,8 +19564,7 @@
},
"node_modules/vscode-languageclient/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==",
+ "license": "ISC",
"dependencies": {
"yallist": "^4.0.0"
},
@@ -17612,8 +19574,7 @@
},
"node_modules/vscode-languageclient/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==",
+ "license": "ISC",
"dependencies": {
"lru-cache": "^6.0.0"
},
@@ -17626,8 +19587,7 @@
},
"node_modules/vscode-languageclient/node_modules/vscode-languageserver-protocol": {
"version": "3.17.2",
- "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.2.tgz",
- "integrity": "sha512-8kYisQ3z/SQ2kyjlNeQxbkkTNmVFoQCqkmGrzLH6A9ecPlgTbp3wDTnUNqaUxYr4vlAcloxx8zwy7G5WdguYNg==",
+ "license": "MIT",
"dependencies": {
"vscode-jsonrpc": "8.0.2",
"vscode-languageserver-types": "3.17.2"
@@ -17635,18 +19595,15 @@
},
"node_modules/vscode-languageclient/node_modules/vscode-languageserver-types": {
"version": "3.17.2",
- "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.2.tgz",
- "integrity": "sha512-zHhCWatviizPIq9B7Vh9uvrH6x3sK8itC84HkamnBWoDFJtzBf7SWlpLCZUit72b3os45h6RWQNC9xHRDF8dRA=="
+ "license": "MIT"
},
"node_modules/vscode-languageclient/node_modules/yallist": {
"version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+ "license": "ISC"
},
"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==",
+ "license": "MIT",
"dependencies": {
"vscode-jsonrpc": "8.2.0",
"vscode-languageserver-types": "3.17.5"
@@ -17654,33 +19611,27 @@
},
"node_modules/vscode-languageserver-protocol/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==",
+ "license": "MIT",
"engines": {
"node": ">=14.0.0"
}
},
"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=="
+ "license": "MIT"
},
"node_modules/vscode-oniguruma": {
"version": "1.7.0",
- "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz",
- "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==",
- "peer": true
+ "license": "MIT"
},
"node_modules/vscode-textmate": {
"version": "7.0.4",
- "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-7.0.4.tgz",
- "integrity": "sha512-9hJp0xL7HW1Q5OgGe03NACo7yiCTMEk3WU/rtKXUbncLtdg6rVVNJnHwD88UhbIYU2KoxY0Dih0x+kIsmUKn2A==",
+ "license": "MIT",
"peer": true
},
"node_modules/vscode-ws-jsonrpc": {
"version": "2.0.2",
- "resolved": "https://registry.npmjs.org/vscode-ws-jsonrpc/-/vscode-ws-jsonrpc-2.0.2.tgz",
- "integrity": "sha512-gIOGdaWwKYwwqohgeRC8AtqqHSNghK8wA3oVcBi7UMAdZnRSAf8n4/Svtd+JHqGiIguYdNa/sC0s4IW3ZDF7mA==",
+ "license": "MIT",
"dependencies": {
"vscode-jsonrpc": "8.0.2"
},
@@ -17689,27 +19640,44 @@
"npm": ">=8.0.0"
}
},
+ "node_modules/wait-on": {
+ "version": "8.0.3",
+ "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-8.0.3.tgz",
+ "integrity": "sha512-nQFqAFzZDeRxsu7S3C7LbuxslHhk+gnJZHyethuGKAn2IVleIbTB9I3vJSQiSR+DifUqmdzfPMoMPJfLqMF2vw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "axios": "^1.8.2",
+ "joi": "^17.13.3",
+ "lodash": "^4.17.21",
+ "minimist": "^1.2.8",
+ "rxjs": "^7.8.2"
+ },
+ "bin": {
+ "wait-on": "bin/wait-on"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
"node_modules/walker": {
"version": "1.0.8",
- "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz",
- "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==",
"license": "Apache-2.0",
+ "optional": true,
+ "peer": true,
"dependencies": {
"makeerror": "1.0.12"
}
},
"node_modules/warning": {
"version": "4.0.3",
- "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz",
- "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==",
+ "license": "MIT",
"dependencies": {
"loose-envify": "^1.0.0"
}
},
"node_modules/watchpack": {
"version": "2.4.2",
- "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz",
- "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==",
"dev": true,
"license": "MIT",
"peer": true,
@@ -17723,17 +19691,16 @@
},
"node_modules/wcwidth": {
"version": "1.0.1",
- "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
- "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==",
"license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
"defaults": "^1.0.3"
}
},
"node_modules/web-namespaces": {
"version": "2.0.1",
- "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz",
- "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==",
+ "license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/wooorm"
@@ -17741,18 +19708,14 @@
},
"node_modules/web-worker": {
"version": "1.3.0",
- "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.3.0.tgz",
- "integrity": "sha512-BSR9wyRsy/KOValMgd5kMyr3JzpdeoR9KVId8u5GVlTTAtNChlsE4yTxeY7zMdNSyOmoKBv8NH2qeRY9Tg+IaA=="
+ "license": "Apache-2.0"
},
"node_modules/webidl-conversions": {
"version": "3.0.1",
- "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
- "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
+ "license": "BSD-2-Clause"
},
"node_modules/webpack": {
"version": "5.95.0",
- "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.95.0.tgz",
- "integrity": "sha512-2t3XstrKULz41MNMBF+cJ97TyHdyQ8HCt//pqErqDvNjU9YQBnZxIHa11VXsi7F3mb5/aO2tuDxdeTPdU7xu9Q==",
"dev": true,
"license": "MIT",
"peer": true,
@@ -17799,23 +19762,55 @@
},
"node_modules/webpack-sources": {
"version": "3.2.3",
- "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
- "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
"dev": true,
+ "license": "MIT",
"peer": true,
"engines": {
"node": ">=10.13.0"
}
},
+ "node_modules/whatwg-encoding": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz",
+ "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==",
+ "license": "MIT",
+ "dependencies": {
+ "iconv-lite": "0.6.3"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/whatwg-encoding/node_modules/iconv-lite": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/whatwg-fetch": {
"version": "3.6.20",
- "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz",
- "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg=="
+ "license": "MIT",
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/whatwg-mimetype": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz",
+ "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
},
"node_modules/whatwg-url": {
"version": "5.0.0",
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
- "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
+ "license": "MIT",
"dependencies": {
"tr46": "~0.0.3",
"webidl-conversions": "^3.0.0"
@@ -17823,8 +19818,7 @@
},
"node_modules/which": {
"version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "license": "ISC",
"dependencies": {
"isexe": "^2.0.0"
},
@@ -17837,9 +19831,8 @@
},
"node_modules/which-boxed-primitive": {
"version": "1.0.2",
- "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
- "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"is-bigint": "^1.0.1",
"is-boolean-object": "^1.1.0",
@@ -17853,9 +19846,8 @@
},
"node_modules/which-collection": {
"version": "1.0.1",
- "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz",
- "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"is-map": "^2.0.1",
"is-set": "^2.0.1",
@@ -17868,21 +19860,24 @@
},
"node_modules/which-module": {
"version": "2.0.1",
- "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz",
- "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==",
- "license": "ISC"
+ "license": "ISC",
+ "optional": true,
+ "peer": true
},
"node_modules/which-typed-array": {
- "version": "1.1.14",
- "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz",
- "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==",
+ "version": "1.1.19",
+ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz",
+ "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "available-typed-arrays": "^1.0.6",
- "call-bind": "^1.0.5",
- "for-each": "^0.3.3",
- "gopd": "^1.0.1",
- "has-tostringtag": "^1.0.1"
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "for-each": "^0.3.5",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-tostringtag": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
@@ -17891,10 +19886,15 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/wicked-good-xpath": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/wicked-good-xpath/-/wicked-good-xpath-1.3.0.tgz",
+ "integrity": "sha512-Gd9+TUn5nXdwj/hFsPVx5cuHHiF5Bwuc30jZ4+ronF1qHK5O7HD0sgmXWSEgwKquT3ClLoKPVbO6qGwVwLzvAw==",
+ "license": "MIT"
+ },
"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==",
+ "license": "MIT",
"dependencies": {
"ansi-styles": "^4.0.0",
"string-width": "^4.1.0",
@@ -17909,8 +19909,7 @@
},
"node_modules/wrap-ansi/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==",
+ "license": "MIT",
"dependencies": {
"color-convert": "^2.0.1"
},
@@ -17923,8 +19922,7 @@
},
"node_modules/wrap-ansi/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==",
+ "license": "MIT",
"dependencies": {
"color-name": "~1.1.4"
},
@@ -17934,13 +19932,11 @@
},
"node_modules/wrap-ansi/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=="
+ "license": "MIT"
},
"node_modules/wrap-ansi/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==",
+ "license": "MIT",
"dependencies": {
"ansi-regex": "^5.0.1"
},
@@ -17950,13 +19946,14 @@
},
"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=="
+ "devOptional": true,
+ "license": "ISC"
},
"node_modules/write-file-atomic": {
"version": "2.4.3",
- "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz",
- "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==",
+ "license": "ISC",
+ "optional": true,
+ "peer": true,
"dependencies": {
"graceful-fs": "^4.1.11",
"imurmurhash": "^0.1.4",
@@ -17965,8 +19962,6 @@
},
"node_modules/ws": {
"version": "8.18.1",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz",
- "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==",
"license": "MIT",
"engines": {
"node": ">=10.0.0"
@@ -17986,30 +19981,27 @@
},
"node_modules/xtend": {
"version": "4.0.2",
- "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
- "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+ "license": "MIT",
"engines": {
"node": ">=0.4"
}
},
"node_modules/y18n": {
"version": "5.0.8",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
- "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "license": "ISC",
"engines": {
"node": ">=10"
}
},
"node_modules/yallist": {
"version": "3.1.1",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
- "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
+ "license": "ISC"
},
"node_modules/yaml": {
"version": "2.7.0",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz",
- "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==",
"license": "ISC",
+ "optional": true,
+ "peer": true,
"bin": {
"yaml": "bin.mjs"
},
@@ -18019,8 +20011,7 @@
},
"node_modules/yargs": {
"version": "17.7.2",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
- "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
+ "license": "MIT",
"dependencies": {
"cliui": "^8.0.1",
"escalade": "^3.1.1",
@@ -18036,16 +20027,26 @@
},
"node_modules/yargs-parser": {
"version": "21.1.1",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
- "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+ "license": "ISC",
"engines": {
"node": ">=12"
}
},
+ "node_modules/yauzl": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
+ "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "buffer-crc32": "~0.2.3",
+ "fd-slicer": "~1.1.0"
+ }
+ },
"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==",
+ "devOptional": true,
+ "license": "MIT",
"engines": {
"node": ">=10"
},
@@ -18055,16 +20056,14 @@
},
"node_modules/zod": {
"version": "3.22.4",
- "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz",
- "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==",
+ "license": "MIT",
"funding": {
"url": "https://github.com/sponsors/colinhacks"
}
},
"node_modules/zwitch": {
"version": "2.0.4",
- "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz",
- "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==",
+ "license": "MIT",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/wooorm"
diff --git a/package.json b/package.json
index b6592b65..d1114451 100644
--- a/package.json
+++ b/package.json
@@ -8,13 +8,13 @@
"@babel/plugin-transform-optional-chaining": "^7.23.0",
"@emotion/react": "^11.10.5",
"@emotion/styled": "^11.10.5",
+ "@floating-ui/react": "^0.27.4",
"@fontsource/roboto": "^4.5.8",
"@fontsource/roboto-mono": "^4.5.8",
"@fortawesome/fontawesome-svg-core": "^6.5.1",
"@fortawesome/free-regular-svg-icons": "^6.5.1",
"@fortawesome/free-solid-svg-icons": "^6.5.1",
"@fortawesome/react-fontawesome": "^0.2.0",
- "@leanprover/infoview": "^0.4.3",
"@mui/icons-material": "^5.11.0",
"@mui/material": "^5.11.1",
"@reduxjs/toolkit": "^1.9.1",
@@ -22,42 +22,55 @@
"@types/got": "^9.6.12",
"@types/react-router-dom": "^5.3.3",
"@vitejs/plugin-react-swc": "^3.4.0",
+ "@vscode/webview-ui-toolkit": "^1.4.0",
"cross-env": "^7.0.3",
"cytoscape": "^3.23.0",
"cytoscape-elk": "^2.1.0",
"cytoscape-klay": "^3.1.4",
"debounce": "^1.2.1",
"express": "^4.18.2",
+ "highlightjs-lean": "^1.2.0",
"got": "^14.4.6",
"i18next": "^23.10.1",
"i18next-http-backend": "^2.5.0",
"i18next-scanner-typescript": "^1.2.0",
+ "ip-anonymize": "^0.1.0",
+ "lean4monaco": "^1.0.46",
+ "marked": "^4.3.0",
+ "memfs": "^4.11.1",
+ "octokit": "^4.1.2",
"lean4-infoview": "https://gitpkg.now.sh/leanprover/vscode-lean4/lean4-infoview?de0062c",
"lean4web": "github:hhu-adam/lean4web#414d9e62638a392fca278761b4c61a1d2e138bc7",
"node-schedule": "^2.1.1",
- "octokit": "^4.1.2",
"path-browserify": "^1.0.1",
- "react": "^18.2.0",
+ "react-contenteditable": "^3.3.7",
"react-country-flag": "^3.1.0",
"react-dom": "^18.2.0",
"react-i18next": "^14.1.0",
"react-markdown": "^8.0.4",
- "react-native": "^0.72.3",
+ "react-popper": "^2.3.0",
"react-redux": "^8.0.5",
"react-router-dom": "^6.5.0",
"react-split": "^2.0.14",
+ "react-syntax-highlighter": "^15.6.1",
"rehype-katex": "^6.0.2",
+ "rehype-mathjax": "^7.1.0",
+ "rehype-raw": "^7.0.0",
"remark-gfm": "^3.0.1",
"remark-math": "^5.1.1",
"uuid": "^11.1.0",
"vite": "^6.2.0",
"vite-plugin-static-copy": "2.3.0",
"vite-plugin-svgr": "^4.3.0",
+ "request": "^2.88.2",
+ "request-progress": "^3.0.0",
+ "rollup": "^4.34.9",
"vscode-ws-jsonrpc": "^2.0.1",
"web-worker": "^1.2.0",
"ws": "^8.18.1"
},
"devDependencies": {
+ "@codingame/esbuild-import-meta-url-plugin": "https://gitpkg.vercel.app/hhu-adam/lean4monaco/esbuild-import-meta-url-plugin?main",
"@pmmmwh/react-refresh-webpack-plugin": "^0.5.10",
"@redux-devtools/core": "^3.13.1",
"@testing-library/react": "^13.4.0",
@@ -66,18 +79,25 @@
"@types/ws": "^8.18.1",
"concurrently": "^7.6.0",
"css-loader": "^6.7.3",
+ "cypress": "^13.17.0",
+ "cypress-iframe": "^1.0.1",
"file-loader": "^6.2.0",
"i18next-scanner": "^4.4.0",
"nodemon": "^3.0.1",
"react-refresh": "^0.14.0",
"style-loader": "^3.3.1",
"ts-loader": "^9.4.2",
- "typescript": "^4.9.4",
- "url-loader": "^4.1.1"
+ "url-loader": "^4.1.1",
+ "vite": "^6.1.1",
+ "vite-plugin-node-polyfills": "^0.23.0",
+ "vite-plugin-static-copy": "^2.2.0",
+ "vite-plugin-svgr": "^4.3.0",
+ "wait-on": "^8.0.2"
},
"scripts": {
- "start": "concurrently -n server,client -c blue,green \"npm run start_server\" \"npm run start_client\"",
- "start_server": "(cd server && lake build) && (cd relay && cross-env NODE_ENV=development nodemon -e mjs --exec \"node ./dist/src/index.js\")",
+ "start": "concurrently -n server,relay,client -c blue,yellow,green \"npm run start_server\" \"npm run start_relay\" \"npm run start_client\"",
+ "start_server": "(cd server && lake build)",
+ "start_relay": "(npm run build_relay) && (cd relay && cross-env NODE_ENV=development nodemon -e mjs --exec \"node ./dist/src/index.js\")",
"start_client": "cross-env NODE_ENV=development vite --host",
"build": "npm run build_server && npm run build_relay && npm run build_client",
"preview": "vite preview",
@@ -85,7 +105,9 @@
"build_client": "cross-env NODE_ENV=production vite build",
"build_relay": "tsc -b ./relay",
"production": "cross-env NODE_ENV=production node relay/index.mjs",
- "translate": "npx i18next-scanner --config client/i18next-scanner.config.cjs"
+ "translate": "npx i18next-scanner --config client/i18next-scanner.config.cjs",
+ "test:bare": "wait-on --resources \"http://localhost:8080\" \"http://localhost:3000\" && cypress run",
+ "test": "concurrently -k -s first -n server,client,cypress -c blue,green,cyan \"npm run start:server\" \"npm run start:client\" \"npm run test:bare\""
},
"eslintConfig": {
"extends": [
diff --git a/relay/scripts/bubblewrap.sh b/relay/scripts/bubblewrap.sh
index a3e5f4ce..258f5ccb 100755
--- a/relay/scripts/bubblewrap.sh
+++ b/relay/scripts/bubblewrap.sh
@@ -1,17 +1,21 @@
#/bin/bash
# Note: This fails if there is no default toolchain installed
-ELAN_HOME=$(lake env printenv ELAN_HOME)
+LEAN_ROOT="$(cd $1 && lean --print-prefix)"
+LEAN_PATH="$(cd $1 && lake env printenv LEAN_PATH)"
# $1 : the game directory
# $2 : the lean4game folder
# $3 : the gameserver executable
+# # print commands as they are executed
+# set -x
+
(exec bwrap\
- --bind $2 /lean4game \
- --bind $1 /game \
- --bind $ELAN_HOME /elan \
- --bind /usr /usr \
+ --ro-bind $2 /lean4game \
+ --ro-bind $1 /game \
+ --ro-bind "$LEAN_ROOT" /lean \
+ --ro-bind /usr /usr \
--dev /dev \
--proc /proc \
--symlink usr/lib /lib\
@@ -19,8 +23,9 @@ ELAN_HOME=$(lake env printenv ELAN_HOME)
--symlink usr/bin /bin\
--symlink usr/sbin /sbin\
--clearenv \
- --setenv PATH "/elan/bin:/bin" \
- --setenv ELAN_HOME "/elan" \
+ --setenv PATH "/lean/bin" \
+ --setenv LAKE "/no" `# tries to invoke git otherwise` \
+ --setenv LEAN_PATH "$LEAN_PATH" \
--unshare-user \
--unshare-pid \
--unshare-net \
@@ -30,3 +35,7 @@ ELAN_HOME=$(lake env printenv ELAN_HOME)
--chdir "/game/.lake/packages/GameServer/server/.lake/build/bin/" \
./gameserver --server /game
)
+
+# TODO
+# --chdir "/game/.lake/packages/GameServer/server/.lake/build/bin/" \
+# ./gameserver --server /game
diff --git a/server/GameServer.lean b/server/GameServer.lean
index 52d1cfba..d0134917 100644
--- a/server/GameServer.lean
+++ b/server/GameServer.lean
@@ -1,17 +1,15 @@
-import GameServer.FileWorker
-import GameServer.Commands
-
--- TODO: The only reason we import `Commands` is so that it gets built to on `lake build`
--- should we have a different solution?
-
-unsafe def main : List String → IO UInt32 := fun args => do
- let e ← IO.getStderr
-
- Lean.enableInitializersExecution
-
- -- TODO: remove this argument
- if args[0]? == some "--server" then
- GameServer.FileWorker.workerMain {} args
- else
- e.putStrLn s!"Expected `--server`"
- return 1
+import GameServer.Command
+import GameServer.Config.SaveData
+import GameServer.EnvExtensions
+import GameServer.Frontend
+import GameServer.Helpers
+import GameServer.Inventory
+import GameServer.Layer
+import GameServer.Lean.DocComment
+import GameServer.Lean.HashMap
+import GameServer.Lean.PrettyPrinter
+import GameServer.Lean.String
+import GameServer.Options
+import GameServer.SaveData
+import GameServer.Tactic
+import GameServer.Util
diff --git a/server/GameServer/Command.lean b/server/GameServer/Command.lean
new file mode 100644
index 00000000..3ef16f28
--- /dev/null
+++ b/server/GameServer/Command.lean
@@ -0,0 +1,6 @@
+import GameServer.Command.Layer
+import GameServer.Command.LayerInfo
+import GameServer.Command.MakeGame
+import GameServer.Command.Dependency
+import GameServer.Command.Doc
+import GameServer.Command.Statement
diff --git a/server/GameServer/Command/Dependency.lean b/server/GameServer/Command/Dependency.lean
new file mode 100644
index 00000000..0fce12df
--- /dev/null
+++ b/server/GameServer/Command/Dependency.lean
@@ -0,0 +1,37 @@
+import GameServer.Layer.Extension
+
+namespace GameServer
+
+open Lean Elab
+
+/-- The worlds of a game are joint by dependencies. These are
+automatically computed but can also be defined with the syntax
+`Dependency World₁ → World₂ → World₃`. -/
+def Parser.dependency := Parser.sepBy1Indent Parser.ident "→"
+
+/-- Manually add a dependency between two worlds.
+
+Normally, the dependencies are computed automatically by the
+tactics & theorems used in the example
+proof and the ones introduced by `NewTheorem`/`NewTactic`.
+Use the command `Dependency World₁ → World₂` to add a manual edge to the graph,
+for example if the only dependency between the worlds is given by
+the narrative. -/
+elab "Dependency" s:Parser.dependency : command => do
+ let mut source? : Option Name := none
+ for stx in s.raw.getArgs.getEvenElems do
+ let some source := source?
+ | do
+ source? := some stx.getId
+ match (← getCurGame).worlds.nodes.get? stx.getId with
+ | some _ => pure ()
+ | none => logErrorAt stx m!"World `{stx.getId}` seems not to exist"
+ continue
+ let target := stx.getId
+ match (← getCurGame).worlds.nodes.get? target with
+ | some _ => pure ()
+ | none => logErrorAt stx m!"World `{target}` seems not to exist"
+
+ modifyCurGame fun game =>
+ pure {game with worlds := {game.worlds with edges := game.worlds.edges.insert (source, target)}}
+ source? := some target
diff --git a/server/GameServer/Command/Doc.lean b/server/GameServer/Command/Doc.lean
new file mode 100644
index 00000000..18b2d767
--- /dev/null
+++ b/server/GameServer/Command/Doc.lean
@@ -0,0 +1,166 @@
+import GameServer.Layer.Extension
+import I18n
+import GameServer.Helpers
+import GameServer.Util.CommandNotDuplicated
+import GameServer.Inventory
+
+/-! ## Doc entries -/
+
+namespace GameServer
+
+open Lean
+
+/-- Documentation entry of a tactic. Example:
+
+```
+TacticDoc rw "`rw` stands for rewrite, etc. "
+```
+
+* The identifier is the tactics name. Some need to be escaped like `«have»`.
+* The description is a string supporting Markdown.
+ -/
+elab doc:docComment ? "TacticDoc" name:ident content:str ? : command => do
+ let doc ← parseDocCommentLegacy doc content
+ let doc ← doc.translate
+ modifyEnv (inventoryTemplateExt.addEntry · {
+ type := .Tactic
+ name := name.getId
+ displayName := name.getId.toString
+ content := doc })
+
+/-- Documentation entry of a theorem. Example:
+
+```
+TheoremDoc Nat.succ_pos as "succ_pos" in "Nat" "says `0 < n.succ`, etc."
+```
+
+* The first identifier is used in the commands `[New/Only/Disabled]Theorem`.
+ It is preferably the true name of the theorem. However, this is not required.
+* The string following `as` is the displayed name (in the Inventory).
+* The identifier after `in` is the category to group theorems by (in the Inventory).
+* The description is a string supporting Markdown.
+
+Use `[[mathlib_doc]]` in the string to insert a link to the mathlib doc page. This requires
+The theorem/definition to have the same fully qualified name as in mathlib.
+ -/
+elab doc:docComment ? "TheoremDoc" name:ident "as" displayName:str "in" category:str content:str ? :
+ command => do
+ let doc ← parseDocCommentLegacy doc content
+ let doc ← doc.translate
+ modifyEnv (inventoryTemplateExt.addEntry · {
+ type := .Theorem
+ name := name.getId
+ category := category.getString
+ displayName := displayName.getString
+ content := doc })
+-- TODO: Catch the following behaviour.
+-- 1. if `TheoremDoc` appears in the same file as `Statement`, it will silently use
+-- it but display the info that it wasn't found in `Statement`
+-- 2. if it appears in a later file, however, it will silently not do anything and keep
+-- the first one.
+
+
+/-- Documentation entry of a definition. Example:
+
+```
+DefinitionDoc Function.Bijective as "Bijective" "defined as `Injective f ∧ Surjective`, etc."
+```
+
+* The first identifier is used in the commands `[New/Only/Disabled]Definition`.
+ It is preferably the true name of the definition. However, this is not required.
+* The string following `as` is the displayed name (in the Inventory).
+* The description is a string supporting Markdown.
+
+Use `[[mathlib_doc]]` in the string to insert a link to the mathlib doc page. This requires
+The theorem/definition to have the same fully qualified name as in mathlib.
+ -/
+elab doc:docComment ? "DefinitionDoc" name:ident "as" displayName:str template:str ? : command => do
+ let doc ← parseDocCommentLegacy doc template
+ let doc ← doc.translate
+ modifyEnv (inventoryTemplateExt.addEntry · {
+ type := .Definition
+ name := name.getId,
+ displayName := displayName.getString,
+ content := doc })
+
+/-- Declare tactics that are introduced by this level. -/
+elab "NewTactic" args:ident* : command => do
+ checkCommandNotDuplicated ((←getCurLevel).tactics.new) "NewTactic"
+ for name in ↑args do
+ checkInventoryDoc .Tactic name -- TODO: Add (template := "[docstring]")
+ modifyCurLevel fun level => pure {level with
+ tactics := {level.tactics with new := level.tactics.new ++ args.map (·.getId)}}
+
+/-- Declare tactics that are introduced by this level but do not show up in inventory. -/
+elab "NewHiddenTactic" args:ident* : command => do
+ checkCommandNotDuplicated ((←getCurLevel).tactics.hidden) "NewHiddenTactic"
+ modifyCurLevel fun level => pure {level with
+ tactics := {level.tactics with new := level.tactics.new ++ args.map (·.getId),
+ hidden := level.tactics.hidden ++ args.map (·.getId)}}
+
+/-- Declare theorems that are introduced by this level. -/
+elab "NewTheorem" args:ident* : command => do
+ checkCommandNotDuplicated ((←getCurLevel).theorems.new) "NewTheorem"
+ for name in ↑args do
+ try let _decl ← getConstInfo name.getId catch
+ | _ => logErrorAt name m!"unknown identifier '{name}'."
+ checkInventoryDoc .Theorem name -- TODO: Add (template := "[mathlib]")
+ modifyCurLevel fun level => pure {level with
+ theorems := {level.theorems with new := args.map (·.getId)}}
+
+/-- Declare definitions that are introduced by this level. -/
+elab "NewDefinition" args:ident* : command => do
+ checkCommandNotDuplicated ((←getCurLevel).definitions.new) "NewDefinition"
+ for name in ↑args do checkInventoryDoc .Definition name -- TODO: Add (template := "[mathlib]")
+ modifyCurLevel fun level => pure {level with
+ definitions := {level.definitions with new := args.map (·.getId)}}
+
+/-- Declare tactics that are temporarily disabled in this level.
+This is ignored if `OnlyTactic` is set. -/
+elab "DisabledTactic" args:ident* : command => do
+ checkCommandNotDuplicated ((←getCurLevel).tactics.disabled) "DisabledTactic"
+ for name in ↑args do checkInventoryDoc .Tactic name
+ modifyCurLevel fun level => pure {level with
+ tactics := {level.tactics with disabled := args.map (·.getId)}}
+
+/-- Declare theorems that are temporarily disabled in this level.
+This is ignored if `OnlyTheorem` is set. -/
+elab "DisabledTheorem" args:ident* : command => do
+ checkCommandNotDuplicated ((←getCurLevel).theorems.disabled) "DisabledTheorem"
+ for name in ↑args do checkInventoryDoc .Theorem name
+ modifyCurLevel fun level => pure {level with
+ theorems := {level.theorems with disabled := args.map (·.getId)}}
+
+/-- Declare definitions that are temporarily disabled in this level -/
+elab "DisabledDefinition" args:ident* : command => do
+ checkCommandNotDuplicated ((←getCurLevel).definitions.disabled) "DisabledDefinition"
+ for name in ↑args do checkInventoryDoc .Definition name
+ modifyCurLevel fun level => pure {level with
+ definitions := {level.definitions with disabled := args.map (·.getId)}}
+
+/-- Temporarily disable all tactics except the ones declared here -/
+elab "OnlyTactic" args:ident* : command => do
+ checkCommandNotDuplicated ((←getCurLevel).tactics.only) "OnlyTactic"
+ for name in ↑args do checkInventoryDoc .Tactic name
+ modifyCurLevel fun level => pure {level with
+ tactics := {level.tactics with only := args.map (·.getId)}}
+
+/-- Temporarily disable all theorems except the ones declared here -/
+elab "OnlyTheorem" args:ident* : command => do
+ checkCommandNotDuplicated ((←getCurLevel).theorems.only) "OnlyTheorem"
+ for name in ↑args do checkInventoryDoc .Theorem name
+ modifyCurLevel fun level => pure {level with
+ theorems := {level.theorems with only := args.map (·.getId)}}
+
+/-- Temporarily disable all definitions except the ones declared here.
+This is ignored if `OnlyDefinition` is set. -/
+elab "OnlyDefinition" args:ident* : command => do
+ checkCommandNotDuplicated ((←getCurLevel).definitions.only) "OnlyDefinition"
+ for name in ↑args do checkInventoryDoc .Definition name
+ modifyCurLevel fun level => pure {level with
+ definitions := {level.definitions with only := args.map (·.getId)}}
+
+/-- Define which tab of Theorems is opened by default. Usage: `TheoremTab "Nat"`.
+If omitted, the current tab will remain open. -/
+elab "TheoremTab" category:str : command =>
+ modifyCurLevel fun level => pure {level with theoremTab := category.getString}
diff --git a/server/GameServer/Command/Layer.lean b/server/GameServer/Command/Layer.lean
new file mode 100644
index 00000000..cf6c46c0
--- /dev/null
+++ b/server/GameServer/Command/Layer.lean
@@ -0,0 +1,30 @@
+import GameServer.Layer.Extension
+
+/-!
+## Commands
+
+Commands to set current `Game`, `World`, `Level`
+-/
+
+namespace GameServer
+
+/-- Switch to the specified `Game` (and create it if non-existent). Example: `Game "NNG"` -/
+elab "Game" n:str : command => do
+ let name := .mkSimple n.getString
+ setCurGameId name
+ if (← getGame? name).isNone then
+ insertGame name {name}
+
+/-- Create a new world in the active game. Example: `World "Addition"` -/
+elab "World" n:str : command => do
+ let name := .mkSimple n.getString
+ setCurWorldId name
+ if ¬ (← getCurGame).worlds.nodes.contains name then
+ addWorld {name}
+
+/-- Define the current level number. Levels inside a world must be
+numbered consecutive starting with `1`. Example: `Level 1` -/
+elab "Level" level:num : command => do
+ let level := level.getNat
+ setCurLevelIdx level
+ addLevel {index := level}
diff --git a/server/GameServer/Command/LayerInfo.lean b/server/GameServer/Command/LayerInfo.lean
new file mode 100644
index 00000000..ef8e4646
--- /dev/null
+++ b/server/GameServer/Command/LayerInfo.lean
@@ -0,0 +1,107 @@
+import GameServer.Layer.Extension
+import I18n
+
+namespace GameServer
+
+open Lean Elab
+
+/-- Define the title of the current game/world/level. -/
+elab "Title" t:str : command => do
+ let title ← t.getString.translate
+ match ← getCurLayer with
+ | .Level => modifyCurLevel fun level => pure {level with title := title}
+ | .World => modifyCurWorld fun world => pure {world with title := title}
+ | .Game => modifyCurGame fun game => pure {game with
+ title := title
+ tile := {game.tile with title := title}}
+
+/-- Define the introduction of the current game/world/level. -/
+elab "Introduction" t:str : command => do
+ let intro ← t.getString.translate
+ match ← getCurLayer with
+ | .Level => modifyCurLevel fun level => pure {level with introduction := intro}
+ | .World => modifyCurWorld fun world => pure {world with introduction := intro}
+ | .Game => modifyCurGame fun game => pure {game with introduction := intro}
+
+/-- Provide the location of the image for the current game/world/level.
+Paths are relative to the lean project's root. -/
+elab "Image" t:str : command => do
+ let file := t.getString
+ if not <| ← System.FilePath.pathExists file then
+ logWarningAt t s!"Make sure the cover image '{file}' exists."
+ if not <| file.startsWith "images/" then
+ logWarningAt t s!"The file name should start with `images/`. Make sure all images are in that folder."
+
+ match ← getCurLayer with
+ | .Level =>
+ logWarning "Level-images not implemented yet" -- TODO
+ modifyCurLevel fun level => pure {level with image := file}
+ | .World =>
+ modifyCurWorld fun world => pure {world with image := file}
+ | .Game =>
+ logWarning "Main image of the game not implemented yet" -- TODO
+ modifyCurGame fun game => pure {game with image := file}
+
+/-- Define the conclusion of the current game or current level if some
+building a level. -/
+elab "Conclusion" t:str : command => do
+ let conclusion ← t.getString.translate
+ match ← getCurLayer with
+ | .Level => modifyCurLevel fun level => pure {level with conclusion := conclusion}
+ | .World => modifyCurWorld fun world => pure {world with conclusion := conclusion}
+ | .Game => modifyCurGame fun game => pure {game with conclusion := conclusion}
+
+/-!
+# Game Info
+
+The following commands provide information about the game which is used on the landing
+page and in the menu (e.g. credits).
+-/
+
+/-- Define the info of the current game. Used for e.g. credits -/
+elab "Info" t:str : command => do
+ let info ← t.getString.translate
+ match ← getCurLayer with
+ | .Level =>
+ logError "Can't use `Info` in a level!"
+ pure ()
+ | .World =>
+ logError "Can't use `Info` in a world"
+ pure ()
+ | .Game => modifyCurGame fun game => pure {game with info := info}
+
+/-- A list of games that should be played before this one. Example `Prerequisites "NNG" "STG"`. -/
+elab "Prerequisites" t:str* : command => do
+ modifyCurGame fun game => pure {game with
+ tile := {game.tile with prerequisites := t.map (·.getString) |>.toList}}
+
+/-- Short caption for the game (1 sentence) -/
+elab "CaptionShort" t:str : command => do
+ let caption ← t.getString.translate
+ modifyCurGame fun game => pure {game with
+ tile := {game.tile with short := caption}}
+
+/-- More detailed description what the game is about (2-4 sentences). -/
+elab "CaptionLong" t:str : command => do
+ let caption ← t.getString.translate
+ modifyCurGame fun game => pure {game with
+ tile := {game.tile with long := caption}}
+
+/-- A list of Languages the game is translated to. For example `Languages "de" "en"`.
+
+The keys are ISO language codes.
+ -/
+elab "Languages" t:str* : command => do
+ modifyCurGame fun game => pure {game with
+ tile := {game.tile with languages := t.map (·.getString) |>.toList}}
+
+/-- The Image of the game (optional). The image should have ratio 500:200. -/
+elab "CoverImage" t:str : command => do
+ let file := t.getString
+ if not <| ← System.FilePath.pathExists file then
+ logWarningAt t s!"Make sure the cover image '{file}' exists."
+ if not <| file.startsWith "images/" then
+ logWarningAt t s!"The file name should start with `images/`. Make sure all images are in that folder."
+
+ modifyCurGame fun game => pure {game with
+ tile := {game.tile with image := file}}
diff --git a/server/GameServer/Command/MakeGame.lean b/server/GameServer/Command/MakeGame.lean
new file mode 100644
index 00000000..27681b25
--- /dev/null
+++ b/server/GameServer/Command/MakeGame.lean
@@ -0,0 +1,354 @@
+import GameServer.SaveData
+import GameServer.Inventory
+import GameServer.Lean.PrettyPrinter
+import GameServer.Options
+import GameServer.Helpers
+
+namespace GameServer
+
+open Lean Elab Command
+
+/-- Build the game. This command will precompute various things about the game, such as which
+tactics are available in each level etc. -/
+elab "MakeGame" : command => do
+ let game ← getCurGame
+
+ let env ← getEnv
+
+ -- Now create The doc entries from the templates
+ for item in inventoryTemplateExt.getState env do
+ let name := item.name
+
+ let content : String ← match item.content with
+ | "" =>
+ -- If documentation is missing, try using the docstring instead.
+ let docstring ← getDocstring env name item.type
+ match docstring with
+ | some ds => pure s!"*(lean docstring)*\\\n{ds}"
+ | none => pure ""
+ | template =>
+ -- TODO: Process content template.
+ -- TODO: Add information about inventory items
+ pure $ template.replace "[[mathlib_doc]]"
+ s!"[mathlib doc](https://leanprover-community.github.io/mathlib4_docs/find/?pattern={name}#doc)"
+
+ match item.type with
+ | .Theorem =>
+ modifyEnv (inventoryExt.addEntry · { item with
+ content := content
+ -- Add the theorem statement to the doc
+ statement := (← getStatementString name)
+ })
+ | _ =>
+ modifyEnv (inventoryExt.addEntry · { item with
+ content := content
+ })
+
+ -- For each `worldId` this contains a set of items used in this world
+ let mut usedItemsInWorld : Std.HashMap Name (Std.HashSet Name) := {}
+
+ -- For each `worldId` this contains a set of items newly defined in this world
+ let mut newItemsInWorld : Std.HashMap Name (Std.HashSet Name) := {}
+
+ -- Items that should not be displayed in inventory
+ let mut hiddenItems : Std.HashSet Name := {}
+
+ let allWorlds := game.worlds.nodes.toArray
+ let nrWorlds := allWorlds.size
+ let mut nrLevels := 0
+
+ -- Calculate which "items" are used/new in which world
+ for (worldId, world) in allWorlds do
+ let mut usedItems : Std.HashSet Name := {}
+ let mut newItems : Std.HashSet Name := {}
+ for inventoryType in #[.Tactic, .Definition, .Theorem] do
+ for (levelId, level) in world.levels.toArray do
+ usedItems := usedItems.insertMany (level.getInventory inventoryType).used
+ newItems := newItems.insertMany (level.getInventory inventoryType).new
+ hiddenItems := hiddenItems.insertMany (level.getInventory inventoryType).hidden
+
+ -- if the previous level was named, we need to add it as a new theorem
+ if inventoryType == .Theorem then
+ match levelId with
+ | 0 => pure ()
+ | 1 => pure () -- level ids start with 1, so we need to skip 1, too
+ | i₀ + 1 =>
+ let some idx := world.levels.get? (i₀) | throwError s!"Level {i₀ + 1} not found for world {worldId}!"
+ match (idx).statementName with
+ | .anonymous => pure ()
+ | .num _ _ => panic "Did not expect to get a numerical statement name!"
+ | .str pre s =>
+ let name := Name.str pre s
+ newItems := newItems.insert name
+
+ if inventoryType == .Theorem then
+
+ -- if the last level was named, we need to add it as a new theorem
+ let i₀ := world.levels.size
+
+ let some idx := world.levels.get? (i₀) | throwError s!"Level {i₀} not found for world {worldId}!"
+ match (idx).statementName with
+ | .anonymous => pure ()
+ | .num _ _ => panic "Did not expect to get a numerical statement name!"
+ | .str pre s =>
+ let name := Name.str pre s
+ newItems := newItems.insert name
+
+ usedItemsInWorld := usedItemsInWorld.insert worldId usedItems
+ newItemsInWorld := newItemsInWorld.insert worldId newItems
+ -- DEBUG: print new/used items
+ -- logInfo m!"{worldId} uses: {usedItems.toList}"
+ -- logInfo m!"{worldId} introduces: {newItems.toList}"
+
+ -- Moreover, count the number of levels in the game
+ nrLevels := nrLevels + world.levels.toArray.size
+
+ /- for each "item" this is a HashSet of `worldId`s that introduce this item -/
+ let mut worldsWithNewItem : Std.HashMap Name (Std.HashSet Name) := {}
+ for (worldId, _world) in allWorlds do
+ for newItem in newItemsInWorld.getD worldId {} do
+ worldsWithNewItem := worldsWithNewItem.insert newItem $
+ (worldsWithNewItem.getD newItem {}).insert worldId
+
+ -- For each `worldId` this is a HashSet of `worldId`s that this world depends on.
+ let mut worldDependsOnWorlds : Std.HashMap Name (Std.HashSet Name) := {}
+
+ -- For a pair of `worldId`s `(id₁, id₂)` this is a HasSet of "items" why `id₁` depends on `id₂`.
+ let mut dependencyReasons : Std.HashMap (Name × Name) (Std.HashSet Name) := {}
+
+ -- Calculate world dependency graph `game.worlds`
+ for (dependentWorldId, _dependentWorld) in allWorlds do
+ let mut dependsOnWorlds : Std.HashSet Name := {}
+ -- Adding manual dependencies that were specified via the `Dependency` command.
+ for (sourceId, targetId) in game.worlds.edges do
+ if targetId = dependentWorldId then
+ dependsOnWorlds := dependsOnWorlds.insert sourceId
+
+ for usedItem in usedItemsInWorld.getD dependentWorldId {} do
+ match worldsWithNewItem.get? usedItem with
+ | none => logWarning m!"No world introducing {usedItem}, but required by {dependentWorldId}"
+ | some worldIds =>
+ -- Only need a new dependency if the world does not introduce an item itself
+ if !worldIds.contains dependentWorldId then
+ -- Add all worlds as dependencies which introduce this item
+ -- TODO: Could do something more clever here.
+ dependsOnWorlds := dependsOnWorlds.insertMany worldIds
+ -- Store the dependency reasons for debugging
+ for worldId in worldIds do
+ let tmp := (dependencyReasons.getD (dependentWorldId, worldId) {}).insert usedItem
+ dependencyReasons := dependencyReasons.insert (dependentWorldId, worldId) tmp
+ worldDependsOnWorlds := worldDependsOnWorlds.insert dependentWorldId dependsOnWorlds
+
+ -- Debugging: show all dependency reasons if the option `lean4game.showDependencyReasons` is set
+ if lean4game.showDependencyReasons.get (← getOptions) then
+ for (world, dependencies) in worldDependsOnWorlds.toArray do
+ if dependencies.isEmpty then
+ logInfo m!"Dependencies of '{world}': none"
+ else
+ let mut msg := m!"Dependencies of '{world}':"
+ for dep in dependencies do
+ match dependencyReasons.get? (world, dep) with
+ | none =>
+ msg := msg ++ m!"\n· '{dep}': no reason found (manually added?)"
+ | some items =>
+ msg := msg ++ m!"\n· '{dep}' because of:\n {items.toList}"
+ logInfo msg
+
+ -- Check graph for loops and remove transitive edges
+ let loop := findLoops worldDependsOnWorlds
+ if loop != [] then
+ logError m!"Loop: Dependency graph has a loop: {loop}"
+ for i in [:loop.length] do
+ let w1 := loop[i]!
+ let w2 := loop[if i == loop.length - 1 then 0 else i + 1]!
+ match dependencyReasons.get? (w1, w2) with
+ -- This should not happen. Could use `find!` again...
+ | none => logError m!"Did not find a reason why {w1} depends on {w2}."
+ | some items =>
+ logError m!"{w1} depends on {w2} because of {items.toList}."
+ else
+ worldDependsOnWorlds ← removeTransitive worldDependsOnWorlds
+
+ -- need to delete all existing edges as they are already present in `worldDependsOnWorlds`.
+ modifyCurGame fun game =>
+ pure {game with worlds := {game.worlds with edges := ∅}}
+
+ for (dependentWorldId, worldIds) in worldDependsOnWorlds.toArray do
+ modifyCurGame fun game =>
+ pure {game with worlds := {game.worlds with
+ edges := game.worlds.edges.insertMany (worldIds.toArray.map fun wid => (wid, dependentWorldId))}}
+
+ -- Add the number of levels and worlds to the tile for the landing page
+ modifyCurGame fun game => pure {game with tile := {game.tile with
+ levels := nrLevels
+ worlds := nrWorlds }}
+
+ -- Apparently we need to reload `game` to get the changes to `game.worlds` we just made
+ let game ← getCurGame
+
+ let mut allItemsByType : Std.HashMap InventoryType (Std.HashSet Name) := {}
+ -- Compute which inventory items are available in which level:
+ for inventoryType in #[.Tactic, .Definition, .Theorem] do
+
+ -- Which items are introduced in which world?
+ let mut theoremStatements : Std.HashMap (Name × Nat) Name := {}
+ -- TODO: I believe `newItemsInWorld` has way to many elements in it which we iterate over
+ -- e.g. we iterate over `ring` for `Theorem`s as well, but so far that seems to cause no problems
+ let mut allItems : Std.HashSet Name := {}
+ for (worldId, world) in game.worlds.nodes.toArray do
+ let mut newItems : Std.HashSet Name := {}
+ for (levelId, level) in world.levels.toArray do
+ let newTheorems := (level.getInventory inventoryType).new
+ newItems := newItems.insertMany newTheorems
+ allItems := allItems.insertMany newTheorems
+ if inventoryType == .Theorem then
+ -- For levels `2, 3, …` we check if the previous level was named
+ -- in which case we add it as available theorem.
+ match levelId with
+ | 0 => pure ()
+ | 1 => pure () -- level ids start with 1, so we need to skip 1, too.
+ | i₀ + 1 =>
+ -- add named statement from previous level to the available theorems.
+ let some idx := world.levels.get? (i₀) | throwError s!"Level {i₀ + 1} not found for world {worldId}!"
+ match (idx).statementName with
+ | .anonymous => pure ()
+ | .num _ _ => panic "Did not expect to get a numerical statement name!"
+ | .str pre s =>
+ let name := Name.str pre s
+ newItems := newItems.insert name
+ allItems := allItems.insert name
+ theoremStatements := theoremStatements.insert (worldId, levelId) name
+ if inventoryType == .Theorem then
+ -- if named, add the theorem from the last level of the world to the inventory
+ let i₀ := world.levels.size
+ match i₀ with
+ | 0 => logWarning m!"World `{worldId}` contains no levels."
+ | i₀ =>
+ let some idx := world.levels.get? (i₀) | throwError s!"Level {i₀} not found for world {worldId}!"
+ match (idx).statementName with
+ | .anonymous => pure ()
+ | .num _ _ => panic "Did not expect to get a numerical statement name!"
+ | .str pre s =>
+ let name := Name.str pre s
+ newItems := newItems.insert name
+ allItems := allItems.insert name
+ newItemsInWorld := newItemsInWorld.insert worldId newItems
+
+ -- Basic inventory item availability: all locked.
+ let Availability₀ : Std.HashMap Name InventoryTile :=
+ Std.HashMap.ofList $
+ ← allItems.toList.filterMapM fun item => do
+ match hiddenItems.contains item, (← getInventoryItem? item inventoryType) with
+ | true, _ =>
+ -- drop hidden items
+ return none
+ | false, none =>
+ -- Note: we did have a panic here before because theorem statement and doc entry
+ -- had mismatching namespaces
+ logError m!"There is no inventory item ({inventoryType}) for: {item}."
+ panic s!"Inventory item {item} not found!"
+ | false, some data =>
+ return some (item, {
+ name := item
+ displayName := data.displayName
+ category := data.category
+ altTitle := data.statement
+ -- TODO: we don't need `hidden` anymore
+ hidden := false })
+
+
+
+ -- Availability after a given world
+ let mut itemsInWorld : Std.HashMap Name (Std.HashMap Name InventoryTile) := {}
+ for (worldId, _) in game.worlds.nodes.toArray do
+ -- Unlock all items from previous worlds
+ let mut items := Availability₀
+ let predecessors := game.worlds.predecessors worldId
+ -- logInfo m!"Predecessors: {predecessors.toArray.map fun (a) => (a)}"
+ for predWorldId in predecessors do
+ for item in newItemsInWorld.getD predWorldId {} do
+ let some data ← getInventoryItem? item inventoryType
+ | continue
+ items := items.insert item {
+ name := item
+ displayName := data.displayName
+ category := data.category
+ locked := false
+ altTitle := data.statement
+ hidden := hiddenItems.contains item }
+ itemsInWorld := itemsInWorld.insert worldId items
+
+ for (worldId, world) in game.worlds.nodes.toArray do
+ let mut items := itemsInWorld.getD worldId {}
+
+ let levels := world.levels.toArray.insertionSort fun a b => a.1 < b.1
+
+ for (levelId, level) in levels do
+ let levelInfo := level.getInventory inventoryType
+
+ -- unlock items that are unlocked in this level
+ for item in levelInfo.new do
+ let some data ← getInventoryItem? item inventoryType
+ | continue
+ items := items.insert item {
+ name := item
+ displayName := data.displayName
+ category := data.category
+ locked := false
+ altTitle := data.statement
+ hidden := hiddenItems.contains item }
+
+ -- add the exercise statement from the previous level
+ -- if it was named
+ if inventoryType == .Theorem then
+ match theoremStatements.get? (worldId, levelId) with
+ | none => pure ()
+ | some name =>
+ let some data ← getInventoryItem? name inventoryType
+ | continue
+ items := items.insert name {
+ name := name
+ displayName := data.displayName
+ category := data.category
+ world := worldId
+ -- from the previous level. This is fine b/c in practise levels start at 1
+ level := (levelId - 1 : Nat)
+ proven := true
+ altTitle := data.statement
+ locked := false }
+
+ -- add marks for `disabled` and `new` theorems here, so that they only apply to
+ -- the current level.
+
+
+ let itemsArray := items.toArray
+ |>.insertionSort (fun a b => a.1.toString < b.1.toString)
+ |>.map (·.2)
+ |>.map (fun item => { item with
+ disabled := if levelInfo.only.size == 0 then
+ levelInfo.disabled.contains item.name
+ else
+ not (levelInfo.only.contains item.name)
+ new := levelInfo.new.contains item.name
+ })
+
+ modifyLevel ⟨← getCurGameId, worldId, levelId⟩ fun level => do
+ return level.setComputedInventory inventoryType itemsArray
+ allItemsByType := allItemsByType.insert inventoryType allItems
+
+ let getTiles (type : InventoryType) : CommandElabM (Array InventoryTile) := do
+ (allItemsByType.getD type {}).toArray.filterMapM (fun name => do
+ match ← getInventoryItem? name type with
+ | none =>
+ if !(hiddenItems.contains name) then
+ logWarning s!"Expected item to exist: {name}"
+ return none
+ | some item => return some item.toTile)
+ let inventory : InventoryOverview := {
+ theorems := (← getTiles .Theorem).map (fun tile => {tile with hidden := hiddenItems.contains tile.name})
+ tactics := (← getTiles .Tactic).map (fun tile => {tile with hidden := hiddenItems.contains tile.name})
+ definitions := (← getTiles .Definition).map (fun tile => {tile with hidden := hiddenItems.contains tile.name})
+ theoremTab := none
+ }
+
+ saveGameData allItemsByType inventory
diff --git a/server/GameServer/Command/Statement.lean b/server/GameServer/Command/Statement.lean
new file mode 100644
index 00000000..210292a2
--- /dev/null
+++ b/server/GameServer/Command/Statement.lean
@@ -0,0 +1,202 @@
+import Lean
+import GameServer.Tactic.LetIntros
+import GameServer.Layer.Extension
+import GameServer.Lean.DocComment
+import GameServer.Inventory
+import I18n
+
+open Lean Meta Elab Command
+
+namespace GameServer
+
+set_option autoImplicit false
+
+
+/-! # Exercise Statement -/
+
+/-- You can write `Statement add_comm (preamble := simp) .... := by` which
+will automatically execute the given tactic sequence before the exercise
+is handed to the player.
+
+A common example is to use
+
+```
+refine { carrier := M, ?.. }
+```
+
+in exercises, where the statement is a structure, to fill in all the data fields.
+
+For example in "Show that all matrices with first column zero form a submodule",
+you could provide the set of all these matrices as `carrier` and the player will receive
+all the `Prop`-valued fields as goals.
+-/
+syntax preambleArg := atomic("(" "preamble" " := " withoutPosition(tacticSeq) ")")
+-- TODO: is this fix correct?
+
+/-- Define the statement of the current level. -/
+elab doc:docComment ? attrs:Parser.Term.attributes ?
+ "Statement" statementName:ident ? preamble:preambleArg ? sig:declSig val:declVal : command => do
+ let lvlIdx ← getCurLevelIdx
+
+ -- Add an optional tactic sequence that the engine executes before the game starts
+ let preambleSeq : TSyntax `Lean.Parser.Tactic.tacticSeq ← match preamble with
+ | some arg => match arg with
+ | `(preambleArg| (preamble := $tac)) => pure tac
+ | _ => `(Parser.Tactic.tacticSeq| skip)
+ | none => `(Parser.Tactic.tacticSeq| skip)
+
+ -- Translate the docstring of the `Statement`
+ let docComment : Option String ← match (← parseDocComment doc) with
+ | none => pure none
+ | some d => d.translate
+
+ -- Save the messages before evaluation of the proof.
+ let initMsgs ← modifyGet fun st => (st.messages, { st with messages := {} })
+
+ -- The default name of the statement is `[Game].[World].level[no.]`, e.g. `NNG.Addition.level1`
+ -- However, this should not be used when designing the game.
+ let defaultDeclName : Ident := mkIdent <| (← getCurGame).name ++ (← getCurWorld).name ++
+ (.mkSimple <| "level" ++ toString lvlIdx)
+
+ -- Collect all used tactics/theorems in the sample proof:
+ let usedInventory : UsedInventory ← match val with
+ | `(Parser.Command.declVal| := $proof:term) => do
+ collectUsedInventory proof
+ | _ => throwError "expected `:=`"
+
+ -- modify the proof to start with `let_intros` and any specified preamble sequence.
+ let modifiedVal ← match val with
+ | `(Parser.Command.declVal| := by $proof) =>
+ `(Parser.Command.declVal| := by {let_intros; $(⟨preambleSeq⟩); $(⟨proof⟩)})
+ | _ => panic "Expected `:= by`!"
+
+ -- Add theorem to context.
+ match statementName with
+ | some name =>
+ let env ← getEnv
+ let fullName := (← getCurrNamespace) ++ name.getId
+ if env.contains fullName then
+ let some orig := env.constants.map₁.get? fullName
+ | throwError s!"error in \"Statement\": `{fullName}` not found."
+ let origType := orig.type
+ -- TODO: Check if `origType` agrees with `sig` and output `logInfo` instead of `logWarning`
+ -- in that case.
+ logWarningAt name (m!"Environment already contains {fullName}! Only the existing " ++
+ m!"statement will be available in later levels:\n\n{origType}")
+ let thmStatement ← `(command| $[$doc]? $[$attrs:attributes]? theorem $defaultDeclName $sig $modifiedVal)
+ elabCommand thmStatement
+ -- Check that statement has a docs entry.
+ checkInventoryDoc .Theorem name (name := fullName) (template := docComment)
+ else
+ let thmStatement ← `(command| $[$doc]? $[$attrs:attributes]? theorem $name $sig $modifiedVal)
+ elabCommand thmStatement
+ -- Check that statement has a docs entry.
+ checkInventoryDoc .Theorem name (name := fullName) (template := docComment)
+ | none =>
+ let thmStatement ← `(command| $[$doc]? $[$attrs:attributes]? theorem $defaultDeclName $sig $modifiedVal)
+ elabCommand thmStatement
+
+ let msgs := (← get).messages
+ let mut hints := #[]
+ let mut nonHintMsgs := #[]
+ for msg in msgs.toArray do
+ -- Look for messages produced by the `Hint` tactic. They are used to pass information about the
+ -- intermediate goal state
+ if let MessageData.withNamingContext _ $ MessageData.withContext ctx $
+ .tagged `Hint $
+ .nest strict $
+ .nest hidden $
+ .nest defeq $
+ .compose (.ofGoal text) (.ofGoal goal) := msg.data then
+ let hint ← liftTermElabM $ withMCtx ctx.mctx $ withLCtx ctx.lctx #[] $ withEnv ctx.env do
+
+ let goalDecl ← goal.getDecl
+ let fvars := goalDecl.lctx.decls.toArray.filterMap id |> Array.map (·.fvarId)
+
+ -- NOTE: This code about `hintFVarsNames` is duplicated from `RpcHandlers`
+ -- where the variable bijection is constructed, and they
+ -- need to be matching.
+ -- NOTE: This is a bit a hack of somebody who does not know how meta-programming works.
+ -- All we want here is a list of `userNames` for the `FVarId`s in `hintFVars`...
+ -- and we wrap them in `«{}»` here since I don't know how to do it later.
+ let mut hintFVarsNames : Array Expr := #[]
+ for fvar in fvars do
+ let name₁ ← fvar.getUserName
+ hintFVarsNames := hintFVarsNames.push <| Expr.fvar ⟨.mkSimple s!"«\{{name₁}}»"⟩
+
+ let text ← instantiateMVars (mkMVar text)
+
+ -- Evaluate the text in the `Hint`'s context to get the old variable names.
+ let rawText := (← GameServer.evalHintMessage text) hintFVarsNames
+ let ctx₂ := {env := ← getEnv, mctx := ← getMCtx, lctx := ← getLCtx, opts := {}}
+ let rawText : String ← (MessageData.withContext ctx₂ rawText).toString
+
+ return {
+ goal := ← abstractCtx goal
+ text := text
+ rawText := rawText
+ strict := strict == 1
+ hidden := hidden == 1
+ defeq := defeq == 1
+ }
+
+ -- Note: The current setup for hints is a bit convoluted, but for now we need to
+ -- send the text once through i18n to register it in the env extension.
+ -- This could probably be rewritten once i18n works fully.
+ let _ ← hint.rawText.translate
+
+ hints := hints.push hint
+ else
+ nonHintMsgs := nonHintMsgs.push msg
+
+ -- restore saved messages and non-hint messages
+ modify fun st => { st with
+ messages := initMsgs ++ {unreported := nonHintMsgs.toPArray'}
+ }
+
+ let scope ← getScope
+ let env ← getEnv
+
+ -- TODO: Is this desired or would it be better to get `elabCommand` above to ignore
+ -- the namespace?
+ let currNamespace ← getCurrNamespace
+
+ -- Format theorem statement for displaying
+ let sigString := sig.raw.reprint.getD ""
+ let descrFormat : String := match statementName with
+ | some name => s!"theorem {name.getId} {sigString} := by"
+ | none => s!"example {sigString} := by"
+
+ modifyCurLevel fun level => pure { level with
+ module := env.header.mainModule
+ goal := sig,
+ preamble := preambleSeq
+ scope := scope,
+ descrText := docComment
+ statementName := match statementName with
+ | none => default
+ | some name => currNamespace ++ name.getId
+ descrFormat := descrFormat
+ hints := hints
+ tactics := {level.tactics with used := usedInventory.tactics.toArray}
+ definitions := {level.definitions with used := usedInventory.definitions.toArray}
+ theorems := {level.theorems with used := usedInventory.theorems.toArray}
+ }
+
+
+
+-- TODO: Notes for testing if a declaration has the simp attribute
+
+-- -- Test: From zulip
+-- section test
+
+-- open Lean Meta Elab Command Tactic Simp
+
+-- def Lean.Meta.SimpTheorems.hasAttribute (d : SimpTheorems) (decl : Name) :=
+-- d.isTheorem (.decl decl) || d.isDeclToUnfold decl
+
+-- def isInSimpset (simpAttr decl: Name) : CoreM Bool := do
+-- let .some simpDecl ←getSimpExtension? simpAttr | return false
+-- return (← simpDecl.getTheorems).hasAttribute decl
+
+-- end test
diff --git a/server/GameServer/Commands.lean b/server/GameServer/Commands.lean
index e30c4264..2f75e4d3 100644
--- a/server/GameServer/Commands.lean
+++ b/server/GameServer/Commands.lean
@@ -1,1008 +1,8 @@
-import GameServer.Helpers
-import GameServer.Inventory
-import GameServer.Options
-import GameServer.SaveData
-import GameServer.Hints
-import GameServer.Tactic.LetIntros
-import GameServer.RpcHandlers -- only needed to collect the translations of "level completed" msgs
-import I18n
+import GameServer.Tactic
+import GameServer.Command
-open Lean Meta Elab Command
+#eval do
+ Lean.logWarning <| "`import GameServer.Commands` is deprecated! " ++
+ "Please replace it with `import GameServer`!"
-open GameServer
-
-set_option autoImplicit false
-
-/-! # Game metadata -/
-
-/-- Switch to the specified `Game` (and create it if non-existent). Example: `Game "NNG"` -/
-elab "Game" n:str : command => do
- let name := n.getString
- setCurGameId name
- if (← getGame? name).isNone then
- insertGame name {name}
-
-/-- Create a new world in the active game. Example: `World "Addition"` -/
-elab "World" n:str : command => do
- let name := n.getString
- setCurWorldId name
- if ¬ (← getCurGame).worlds.nodes.contains name then
- addWorld {name}
-
-/-- Define the current level number. Levels inside a world must be
-numbered consecutive starting with `1`. Example: `Level 1` -/
-elab "Level" level:num : command => do
- let level := level.getNat
- setCurLevelIdx level
- addLevel {index := level}
-
-/-- Define the title of the current game/world/level. -/
-elab "Title" t:str : command => do
- let title ← t.getString.translate
- match ← getCurLayer with
- | .Level => modifyCurLevel fun level => pure {level with title := title}
- | .World => modifyCurWorld fun world => pure {world with title := title}
- | .Game => modifyCurGame fun game => pure {game with
- title := title
- tile := {game.tile with title := title}}
-
-/-- Define the introduction of the current game/world/level. -/
-elab "Introduction" t:str : command => do
- let intro ← t.getString.translate
- match ← getCurLayer with
- | .Level => modifyCurLevel fun level => pure {level with introduction := intro}
- | .World => modifyCurWorld fun world => pure {world with introduction := intro}
- | .Game => modifyCurGame fun game => pure {game with introduction := intro}
-
-/-- Define the info of the current game. Used for e.g. credits -/
-elab "Info" t:str : command => do
- let info ← t.getString.translate
- match ← getCurLayer with
- | .Level =>
- logError "Can't use `Info` in a level!"
- pure ()
- | .World =>
- logError "Can't use `Info` in a world"
- pure ()
- | .Game => modifyCurGame fun game => pure {game with info := info}
-
-/-- Provide the location of the image for the current game/world/level.
-Paths are relative to the lean project's root. -/
-elab "Image" t:str : command => do
- let file := t.getString
- if not <| ← System.FilePath.pathExists file then
- logWarningAt t s!"Make sure the cover image '{file}' exists."
- if not <| file.startsWith "images/" then
- logWarningAt t s!"The file name should start with `images/`. Make sure all images are in that folder."
-
- match ← getCurLayer with
- | .Level =>
- logWarning "Level-images not implemented yet" -- TODO
- modifyCurLevel fun level => pure {level with image := file}
- | .World =>
- modifyCurWorld fun world => pure {world with image := file}
- | .Game =>
- logWarning "Main image of the game not implemented yet" -- TODO
- modifyCurGame fun game => pure {game with image := file}
-
-/-- Define the conclusion of the current game or current level if some
-building a level. -/
-elab "Conclusion" t:str : command => do
- let conclusion ← t.getString.translate
- match ← getCurLayer with
- | .Level => modifyCurLevel fun level => pure {level with conclusion := conclusion}
- | .World => modifyCurWorld fun world => pure {world with conclusion := conclusion}
- | .Game => modifyCurGame fun game => pure {game with conclusion := conclusion}
-
-/-- A list of games that should be played before this one. Example `Prerequisites "NNG" "STG"`. -/
-elab "Prerequisites" t:str* : command => do
- modifyCurGame fun game => pure {game with
- tile := {game.tile with prerequisites := t.map (·.getString) |>.toList}}
-
-/-- Short caption for the game (1 sentence) -/
-elab "CaptionShort" t:str : command => do
- let caption ← t.getString.translate
- modifyCurGame fun game => pure {game with
- tile := {game.tile with short := caption}}
-
-/-- More detailed description what the game is about (2-4 sentences). -/
-elab "CaptionLong" t:str : command => do
- let caption ← t.getString.translate
- modifyCurGame fun game => pure {game with
- tile := {game.tile with long := caption}}
-
-/-- A list of Languages the game is translated to. For example `Languages "de" "en"`.
-
-The keys are ISO language codes.
- -/
-elab "Languages" t:str* : command => do
- modifyCurGame fun game => pure {game with
- tile := {game.tile with languages := t.map (·.getString) |>.toList}}
-
-/-- The Image of the game (optional). TODO: Not implemented -/
-elab "CoverImage" t:str : command => do
- let file := t.getString
- if not <| ← System.FilePath.pathExists file then
- logWarningAt t s!"Make sure the cover image '{file}' exists."
- if not <| file.startsWith "images/" then
- logWarningAt t s!"The file name should start with `images/`. Make sure all images are in that folder."
-
- modifyCurGame fun game => pure {game with
- tile := {game.tile with image := file}}
-
-/-! # Inventory
-
-The inventory contains docs for tactics, theorems, and definitions. These are all locked
-in the first level and get enabled during the game.
--/
-
-/-! ## Doc entries -/
-
-/-- Documentation entry of a tactic. Example:
-
-```
-TacticDoc rw "`rw` stands for rewrite, etc. "
-```
-
-* The identifier is the tactics name. Some need to be escaped like `«have»`.
-* The description is a string supporting Markdown.
- -/
-elab doc:docComment ? "TacticDoc" name:ident content:str ? : command => do
- let doc ← parseDocCommentLegacy doc content
- let doc ← doc.translate
- modifyEnv (inventoryTemplateExt.addEntry · {
- type := .Tactic
- name := name.getId
- displayName := name.getId.toString
- content := doc })
-
-/-- Documentation entry of a theorem. Example:
-
-```
-TheoremDoc Nat.succ_pos as "succ_pos" in "Nat" "says `0 < n.succ`, etc."
-```
-
-* The first identifier is used in the commands `[New/Only/Disabled]Theorem`.
- It is preferably the true name of the theorem. However, this is not required.
-* The string following `as` is the displayed name (in the Inventory).
-* The identifier after `in` is the category to group theorems by (in the Inventory).
-* The description is a string supporting Markdown.
-
-Use `[[mathlib_doc]]` in the string to insert a link to the mathlib doc page. This requires
-The theorem/definition to have the same fully qualified name as in mathlib.
- -/
-elab doc:docComment ? "TheoremDoc" name:ident "as" displayName:str "in" category:str content:str ? :
- command => do
- let doc ← parseDocCommentLegacy doc content
- let doc ← doc.translate
- modifyEnv (inventoryTemplateExt.addEntry · {
- type := .Lemma
- name := name.getId
- category := category.getString
- displayName := displayName.getString
- content := doc })
--- TODO: Catch the following behaviour.
--- 1. if `TheoremDoc` appears in the same file as `Statement`, it will silently use
--- it but display the info that it wasn't found in `Statement`
--- 2. if it appears in a later file, however, it will silently not do anything and keep
--- the first one.
-
-
-/-- Documentation entry of a definition. Example:
-
-```
-DefinitionDoc Function.Bijective as "Bijective" "defined as `Injective f ∧ Surjective`, etc."
-```
-
-* The first identifier is used in the commands `[New/Only/Disabled]Definition`.
- It is preferably the true name of the definition. However, this is not required.
-* The string following `as` is the displayed name (in the Inventory).
-* The description is a string supporting Markdown.
-
-Use `[[mathlib_doc]]` in the string to insert a link to the mathlib doc page. This requires
-The theorem/definition to have the same fully qualified name as in mathlib.
- -/
-elab doc:docComment ? "DefinitionDoc" name:ident "as" displayName:str template:str ? : command => do
- let doc ← parseDocCommentLegacy doc template
- let doc ← doc.translate
- modifyEnv (inventoryTemplateExt.addEntry · {
- type := .Definition
- name := name.getId,
- displayName := displayName.getString,
- content := doc })
-
-/-! ## Add inventory items -/
-
-def checkCommandNotDuplicated (items : Array Name) (cmd := "Command") : CommandElabM Unit := do
- if ¬ items.isEmpty then
- logWarning s!"You should only use one `{cmd}` per level, but it takes multiple arguments: `{cmd} obj₁ obj₂ obj₃`!"
-
-/-- Declare tactics that are introduced by this level. -/
-elab "NewTactic" args:ident* : command => do
- checkCommandNotDuplicated ((←getCurLevel).tactics.new) "NewTactic"
- for name in ↑args do
- checkInventoryDoc .Tactic name -- TODO: Add (template := "[docstring]")
- modifyCurLevel fun level => pure {level with
- tactics := {level.tactics with new := level.tactics.new ++ args.map (·.getId)}}
-
-/-- Declare tactics that are introduced by this level but do not show up in inventory. -/
-elab "NewHiddenTactic" args:ident* : command => do
- checkCommandNotDuplicated ((←getCurLevel).tactics.hidden) "NewHiddenTactic"
- for name in ↑args do
- checkInventoryDoc .Tactic name (template := "")
- modifyCurLevel fun level => pure {level with
- tactics := {level.tactics with new := level.tactics.new ++ args.map (·.getId),
- hidden := level.tactics.hidden ++ args.map (·.getId)}}
-
-/-- Declare theorems that are introduced by this level. -/
-elab "NewTheorem" args:ident* : command => do
- checkCommandNotDuplicated ((←getCurLevel).lemmas.new) "NewTheorem"
- for name in ↑args do
- try let _decl ← getConstInfo name.getId catch
- | _ => logErrorAt name m!"unknown identifier '{name}'."
- checkInventoryDoc .Lemma name -- TODO: Add (template := "[mathlib]")
- modifyCurLevel fun level => pure {level with
- lemmas := {level.lemmas with new := args.map (·.getId)}}
-
-/-- Declare definitions that are introduced by this level. -/
-elab "NewDefinition" args:ident* : command => do
- checkCommandNotDuplicated ((←getCurLevel).definitions.new) "NewDefinition"
- for name in ↑args do checkInventoryDoc .Definition name -- TODO: Add (template := "[mathlib]")
- modifyCurLevel fun level => pure {level with
- definitions := {level.definitions with new := args.map (·.getId)}}
-
-/-- Declare tactics that are temporarily disabled in this level.
-This is ignored if `OnlyTactic` is set. -/
-elab "DisabledTactic" args:ident* : command => do
- checkCommandNotDuplicated ((←getCurLevel).tactics.disabled) "DisabledTactic"
- for name in ↑args do checkInventoryDoc .Tactic name
- modifyCurLevel fun level => pure {level with
- tactics := {level.tactics with disabled := args.map (·.getId)}}
-
-/-- Declare theorems that are temporarily disabled in this level.
-This is ignored if `OnlyTheorem` is set. -/
-elab "DisabledTheorem" args:ident* : command => do
- checkCommandNotDuplicated ((←getCurLevel).lemmas.disabled) "DisabledTheorem"
- for name in ↑args do checkInventoryDoc .Lemma name
- modifyCurLevel fun level => pure {level with
- lemmas := {level.lemmas with disabled := args.map (·.getId)}}
-
-/-- Declare definitions that are temporarily disabled in this level -/
-elab "DisabledDefinition" args:ident* : command => do
- checkCommandNotDuplicated ((←getCurLevel).definitions.disabled) "DisabledDefinition"
- for name in ↑args do checkInventoryDoc .Definition name
- modifyCurLevel fun level => pure {level with
- definitions := {level.definitions with disabled := args.map (·.getId)}}
-
-/-- Temporarily disable all tactics except the ones declared here -/
-elab "OnlyTactic" args:ident* : command => do
- checkCommandNotDuplicated ((←getCurLevel).tactics.only) "OnlyTactic"
- for name in ↑args do checkInventoryDoc .Tactic name
- modifyCurLevel fun level => pure {level with
- tactics := {level.tactics with only := args.map (·.getId)}}
-
-/-- Temporarily disable all theorems except the ones declared here -/
-elab "OnlyTheorem" args:ident* : command => do
- checkCommandNotDuplicated ((←getCurLevel).lemmas.only) "OnlyTheorem"
- for name in ↑args do checkInventoryDoc .Lemma name
- modifyCurLevel fun level => pure {level with
- lemmas := {level.lemmas with only := args.map (·.getId)}}
-
-/-- Temporarily disable all definitions except the ones declared here.
-This is ignored if `OnlyDefinition` is set. -/
-elab "OnlyDefinition" args:ident* : command => do
- checkCommandNotDuplicated ((←getCurLevel).definitions.only) "OnlyDefinition"
- for name in ↑args do checkInventoryDoc .Definition name
- modifyCurLevel fun level => pure {level with
- definitions := {level.definitions with only := args.map (·.getId)}}
-
-/-- Define which tab of Lemmas is opened by default. Usage: `TheoremTab "Nat"`.
-If omitted, the current tab will remain open. -/
-elab "TheoremTab" category:str : command =>
- modifyCurLevel fun level => pure {level with lemmaTab := category.getString}
-
-
-/-! DEPRECATED -/
-
-elab doc:docComment ? "LemmaDoc" name:ident "as" displayName:str "in" category:str content:str ? :
- command => do
- logWarning "Deprecated. Has been renamed to `TheoremDoc`"
- let doc ← parseDocCommentLegacy doc content
- modifyEnv (inventoryTemplateExt.addEntry · {
- type := .Lemma
- name := name.getId
- category := category.getString
- displayName := displayName.getString
- content := doc })
-
-elab "NewLemma" args:ident* : command => do
- logWarning "Deprecated. Has been renamed to `NewTheorem`"
- checkCommandNotDuplicated ((←getCurLevel).lemmas.new) "NewLemma"
- for name in ↑args do
- try let _decl ← getConstInfo name.getId catch
- | _ => logErrorAt name m!"unknown identifier '{name}'."
- checkInventoryDoc .Lemma name -- TODO: Add (template := "[mathlib]")
- modifyCurLevel fun level => pure {level with
- lemmas := {level.lemmas with new := args.map (·.getId)}}
-
-elab "DisabledLemma" args:ident* : command => do
- logWarning "Deprecated. Has been renamed to `DisabledTheorem`"
- checkCommandNotDuplicated ((←getCurLevel).lemmas.disabled) "DisabledLemma"
- for name in ↑args do checkInventoryDoc .Lemma name
- modifyCurLevel fun level => pure {level with
- lemmas := {level.lemmas with disabled := args.map (·.getId)}}
-
-elab "OnlyLemma" args:ident* : command => do
- logWarning "Deprecated. Has been renamed to `OnlyTheorem`"
- checkCommandNotDuplicated ((←getCurLevel).lemmas.only) "OnlyLemma"
- for name in ↑args do checkInventoryDoc .Lemma name
- modifyCurLevel fun level => pure {level with
- lemmas := {level.lemmas with only := args.map (·.getId)}}
-
-elab "LemmaTab" category:str : command => do
- logWarning "Deprecated. Has been renamed to `TheoremTab`"
- modifyCurLevel fun level => pure {level with lemmaTab := category.getString}
-
-/-! # Exercise Statement -/
-
-/-- You can write `Statement add_comm (preamble := simp) .... := by` which
-will automatically execute the given tactic sequence before the exercise
-is handed to the player.
-
-A common example is to use
-
-```
-refine { carrier := M, ?.. }
-```
-
-in exercises, where the statement is a structure, to fill in all the data fields.
-
-For example in "Show that all matrices with first column zero form a submodule",
-you could provide the set of all these matrices as `carrier` and the player will receive
-all the `Prop`-valued fields as goals.
--/
-syntax preambleArg := atomic(" (preamble := " withoutPosition(tacticSeq) ")")
-
-/-- Define the statement of the current level. -/
-elab doc:docComment ? attrs:Parser.Term.attributes ?
- "Statement" statementName:ident ? preamble:preambleArg ? sig:declSig val:declVal : command => do
- let lvlIdx ← getCurLevelIdx
-
- -- add an optional tactic sequence that the engine executes before the game starts
- let preambleSeq : TSyntax `Lean.Parser.Tactic.tacticSeq ← match preamble with
- | none => `(Parser.Tactic.tacticSeq|skip)
- | some x => match x with
- | `(preambleArg| (preamble := $tac)) => pure tac
- | _ => `(Parser.Tactic.tacticSeq|skip)
-
- let docContent ← parseDocComment doc
- let docContent ← match docContent with
- | none => pure none
- | some d => d.translate
-
- -- Save the messages before evaluation of the proof.
- let initMsgs ← modifyGet fun st => (st.messages, { st with messages := {} })
-
- -- The default name of the statement is `[Game].[World].level[no.]`, e.g. `NNG.Addition.level1`
- -- However, this should not be used when designing the game.
- let defaultDeclName : Ident := mkIdent <| (← getCurGame).name ++ (← getCurWorld).name ++
- ("level" ++ toString lvlIdx : String)
-
- -- Collect all used tactics/lemmas in the sample proof:
- let usedInventory ← match val with
- | `(Parser.Command.declVal| := $proof:term) => do
- collectUsedInventory proof
- | _ => throwError "expected `:=`"
-
- -- extract the `tacticSeq` from `val` in order to add `let_intros` in front.
- -- TODO: don't understand meta-programming enough to avoid having `let_intros`
- -- duplicated three times below…
- let tacticStx : TSyntax `Lean.Parser.Tactic.tacticSeq := match val with
- | `(Parser.Command.declVal| := by $proof) => proof
- | _ => panic "expected `:= by`"
-
- -- Add theorem to context.
- match statementName with
- | some name =>
- let env ← getEnv
- let fullName := (← getCurrNamespace) ++ name.getId
- if env.contains fullName then
- let some orig := env.constants.map₁.find? fullName
- | throwError s!"error in \"Statement\": `{fullName}` not found."
- let origType := orig.type
- -- TODO: Check if `origType` agrees with `sig` and output `logInfo` instead of `logWarning`
- -- in that case.
- logWarningAt name (m!"Environment already contains {fullName}! Only the existing " ++
- m!"statement will be available in later levels:\n\n{origType}")
- let thmStatement ← `(command| $[$doc]? $[$attrs:attributes]? theorem $defaultDeclName $sig := by {let_intros; $(⟨preambleSeq⟩); $(⟨tacticStx⟩)})
- elabCommand thmStatement
- -- Check that statement has a docs entry.
- checkInventoryDoc .Lemma name (name := fullName) (template := docContent)
- else
- let thmStatement ← `(command| $[$doc]? $[$attrs:attributes]? theorem $name $sig := by {let_intros; $(⟨preambleSeq⟩); $(⟨tacticStx⟩)})
- elabCommand thmStatement
- -- Check that statement has a docs entry.
- checkInventoryDoc .Lemma name (name := fullName) (template := docContent)
- | none =>
- let thmStatement ← `(command| $[$doc]? $[$attrs:attributes]? theorem $defaultDeclName $sig := by {let_intros; $(⟨preambleSeq⟩); $(⟨tacticStx⟩)})
- elabCommand thmStatement
-
- let msgs := (← get).messages
- let mut hints := #[]
- let mut nonHintMsgs := #[]
- for msg in msgs.msgs do
- -- Look for messages produced by the `Hint` tactic. They are used to pass information about the
- -- intermediate goal state
- if let MessageData.withNamingContext _ $ MessageData.withContext ctx $
- .tagged `Hint $
- .nest strict $
- .nest hidden $
- .compose (.ofGoal text) (.ofGoal goal) := msg.data then
- let hint ← liftTermElabM $ withMCtx ctx.mctx $ withLCtx ctx.lctx #[] $ withEnv ctx.env do
-
- let goalDecl ← goal.getDecl
- let fvars := goalDecl.lctx.decls.toArray.filterMap id |> Array.map (·.fvarId)
-
- -- NOTE: This code about `hintFVarsNames` is duplicated from `RpcHandlers`
- -- where the variable bijection is constructed, and they
- -- need to be matching.
- -- NOTE: This is a bit a hack of somebody who does not know how meta-programming works.
- -- All we want here is a list of `userNames` for the `FVarId`s in `hintFVars`...
- -- and we wrap them in `«{}»` here since I don't know how to do it later.
- let mut hintFVarsNames : Array Expr := #[]
- for fvar in fvars do
- let name₁ ← fvar.getUserName
- hintFVarsNames := hintFVarsNames.push <| Expr.fvar ⟨s!"«\{{name₁}}»"⟩
-
- let text ← instantiateMVars (mkMVar text)
-
- -- Evaluate the text in the `Hint`'s context to get the old variable names.
- let rawText := (← GameServer.evalHintMessage text) hintFVarsNames
- let ctx₂ := {env := ← getEnv, mctx := ← getMCtx, lctx := ← getLCtx, opts := {}}
- let rawText : String ← (MessageData.withContext ctx₂ rawText).toString
-
- return {
- goal := ← abstractCtx goal
- text := text
- rawText := rawText
- strict := strict == 1
- hidden := hidden == 1
- }
-
- -- Note: The current setup for hints is a bit convoluted, but for now we need to
- -- send the text once through i18n to register it in the env extension.
- -- This could probably be rewritten once i18n works fully.
- let _ ← hint.rawText.translate
-
- hints := hints.push hint
- else
- nonHintMsgs := nonHintMsgs.push msg
-
- -- restore saved messages and non-hint messages
- modify fun st => { st with
- messages := initMsgs ++ ⟨nonHintMsgs.toPArray'⟩
- }
-
- let scope ← getScope
- let env ← getEnv
-
- -- TODO: Is this desired or would it be better to get `elabCommand` above to ignore
- -- the namespace?
- let currNamespace ← getCurrNamespace
-
- -- Format theorem statement for displaying
- let sigString := sig.raw.reprint.getD ""
- let descrFormat : String := match statementName with
- | some name => s!"theorem {name.getId} {sigString} := by"
- | none => s!"example {sigString} := by"
-
- modifyCurLevel fun level => pure { level with
- module := env.header.mainModule
- goal := sig,
- preamble := preambleSeq
- scope := scope,
- descrText := docContent
- statementName := match statementName with
- | none => default
- | some name => currNamespace ++ name.getId
- descrFormat := descrFormat
- hints := hints
- tactics := {level.tactics with used := usedInventory.tactics.toArray}
- definitions := {level.definitions with used := usedInventory.definitions.toArray}
- lemmas := {level.lemmas with used := usedInventory.lemmas.toArray}
- }
-
-/-! # Hints -/
-
-open GameServer in
-
-/-- A tactic that can be used inside `Statement`s to indicate in which proof states players should
-see hints. The tactic does not affect the goal state.
--/
-elab (name := GameServer.Tactic.Hint) "Hint" args:hintArg* msg:interpolatedStr(term) : tactic => do
- let mut strict := false
- let mut hidden := false
-
- -- remove spaces at the beginning of new lines
- let msg := TSyntax.mk $ msg.raw.setArgs $ ← msg.raw.getArgs.mapM fun m => do
- match m with
- | Syntax.node info k args =>
- if k == interpolatedStrLitKind && args.size == 1 then
- match args.get! 0 with
- | (Syntax.atom info' val) =>
- let val := removeIndentation val
- return Syntax.node info k #[Syntax.atom info' val]
- | _ => return m
- else
- return m
- | _ => return m
-
- for arg in args do
- match arg with
- | `(hintArg| (strict := true)) => strict := true
- | `(hintArg| (strict := false)) => strict := false
- | `(hintArg| (hidden := true)) => hidden := true
- | `(hintArg| (hidden := false)) => hidden := false
- | _ => throwUnsupportedSyntax
-
- let goal ← Tactic.getMainGoal
- goal.withContext do
- -- We construct an expression that can produce the hint text. The difficulty is that we
- -- want the text to possibly contain quotation of the local variables which might have been
- -- named differently by the player.
- let varsName := `vars
- let text ← withLocalDeclD varsName (mkApp (mkConst ``Array [levelZero]) (mkConst ``Expr)) fun vars => do
- let mut text ← `(m! $msg)
- let goalDecl ← goal.getDecl
- let decls := goalDecl.lctx.decls.toArray.filterMap id
- for i in [:decls.size] do
- text ← `(let $(mkIdent decls[i]!.userName) := $(mkIdent varsName)[$(quote i)]!; $text)
- return ← mkLambdaFVars #[vars] $ ← Term.elabTermAndSynthesize text none
- let textmvar ← mkFreshExprMVar none
- guard $ ← isDefEq textmvar text -- Store the text in a mvar.
- -- The information about the hint is logged as a message using `logInfo` to transfer it to the
- -- `Statement` command:
- logInfo $
- .tagged `Hint $
- .nest (if strict then 1 else 0) $
- .nest (if hidden then 1 else 0) $
- .compose (.ofGoal textmvar.mvarId!) (.ofGoal goal)
-
-/-- This tactic allows us to execute an alternative sequence of tactics, but without affecting the
-proof state. We use it to define Hints for alternative proof methods or dead ends. -/
-elab (name := GameServer.Tactic.Branch) "Branch" t:tacticSeq : tactic => do
- let b ← saveState
- Tactic.evalTactic t
-
- -- Show an info whether the branch proofs all remaining goals.
- let gs ← Tactic.getUnsolvedGoals
- if gs.isEmpty then
- -- trace[debug] "This branch finishes the proof."
- pure ()
- else
- trace[debug] "This branch leaves open goals."
-
- let msgs ← Core.getMessageLog
- b.restore
- Core.setMessageLog msgs
-
-/-- A hole inside a template proof that will be replaced by `sorry`. -/
-elab (name := GameServer.Tactic.Hole) "Hole" t:tacticSeq : tactic => do
- Tactic.evalTactic t
-
-/--
-Iterate recursively through the Syntax, replace `Hole` with `sorry` and remove all
-`Hint`/`Branch` occurrences.
--/
-def replaceHoles (tacs : Syntax) : Syntax :=
- match tacs with
- | Syntax.node info kind ⟨args⟩ =>
- let newArgs := filterArgs args
- Syntax.node info kind ⟨newArgs⟩
- | other => other
-where filterArgs (args : List Syntax) : List Syntax :=
- match args with
- | [] => []
- -- replace `Hole` with `sorry`.
- | Syntax.node info `GameServer.Tactic.Hole _ :: r =>
- Syntax.node info `Lean.Parser.Tactic.tacticSorry #[Syntax.atom info "sorry"] :: filterArgs r
- -- delete all `Hint` and `Branch` occurrences in the middle.
- | Syntax.node _ `GameServer.Tactic.Hint _ :: _ :: r
- | Syntax.node _ `GameServer.Tactic.Branch _ :: _ :: r =>
- filterArgs r
- -- delete `Hint` and `Branch` occurrence at the end of the tactic sequence.
- | Syntax.node _ `GameServer.Tactic.Hint _ :: []
- | Syntax.node _ `GameServer.Tactic.Branch _ :: [] =>
- []
- -- Recurse on all other Syntax.
- | a :: rest =>
- replaceHoles a :: filterArgs rest
-
-/-- The tactic block inside `Template` will be copied into the users editor.
-Use `Hole` inside the template for a part of the proof that should be replaced
-with `sorry`. -/
-elab "Template" tacs:tacticSeq : tactic => do
- Tactic.evalTactic tacs
- let newTacs : TSyntax `Lean.Parser.Tactic.tacticSeq := ⟨replaceHoles tacs.raw⟩
- let template ← PrettyPrinter.ppCategory `Lean.Parser.Tactic.tacticSeq newTacs
- trace[debug] s!"Template:\n{template}"
- modifyLevel (←getCurLevelId) fun level => do
- return {level with template := s!"{template}"}
-
-
--- TODO: Notes for testing if a declaration has the simp attribute
-
--- -- Test: From zulip
--- section test
-
--- open Lean Meta Elab Command Tactic Simp
-
--- def Lean.Meta.SimpTheorems.hasAttribute (d : SimpTheorems) (decl : Name) :=
--- d.isLemma (.decl decl) || d.isDeclToUnfold decl
-
--- def isInSimpset (simpAttr decl: Name) : CoreM Bool := do
--- let .some simpDecl ←getSimpExtension? simpAttr | return false
--- return (← simpDecl.getTheorems).hasAttribute decl
-
--- end test
-
-/-! # Make Game -/
-
-/-- The worlds of a game are joint by dependencies. These are
-automatically computed but can also be defined with the syntax
-`Dependency World₁ → World₂ → World₃`. -/
-def Parser.dependency := Parser.sepBy1Indent Parser.ident "→"
-
-/-- Manually add a dependency between two worlds.
-
-Normally, the dependencies are computed automatically by the
-tactics & lemmas used in the example
-proof and the ones introduced by `NewLemma`/`NewTactic`.
-Use the command `Dependency World₁ → World₂` to add a manual edge to the graph,
-for example if the only dependency between the worlds is given by
-the narrative. -/
-elab "Dependency" s:Parser.dependency : command => do
- let mut source? : Option Name := none
- for stx in s.raw.getArgs.getEvenElems do
- let some source := source?
- | do
- source? := some stx.getId
- continue
- let target := stx.getId
- match (← getCurGame).worlds.nodes.find? target with
- | some _ => pure ()
- | none => logErrorAt stx m!"World `{target}` seems not to exist"
-
- modifyCurGame fun game =>
- pure {game with worlds := {game.worlds with edges := game.worlds.edges.push (source, target)}}
- source? := some target
-
-/-- Build the game. This command will precompute various things about the game, such as which
-tactics are available in each level etc. -/
-elab "MakeGame" : command => do
- let game ← getCurGame
-
- let env ← getEnv
-
- -- Now create The doc entries from the templates
- for item in inventoryTemplateExt.getState env do
- let name := item.name
-
- let content : String ← match item.content with
- | "" =>
- -- If documentation is missing, try using the docstring instead.
- let docstring ← getDocstring env name item.type
- match docstring with
- | some ds => pure s!"*(lean docstring)*\\\n{ds}"
- | none => pure "(missing)"
- | template =>
- -- TODO: Process content template.
- -- TODO: Add information about inventory items
- pure $ template.replace "[[mathlib_doc]]"
- s!"[mathlib doc](https://leanprover-community.github.io/mathlib4_docs/find/?pattern={name}#doc)"
-
- match item.type with
- | .Lemma =>
- modifyEnv (inventoryExt.addEntry · { item with
- content := content
- -- Add the lemma statement to the doc
- statement := (← getStatementString name)
- })
- | _ =>
- modifyEnv (inventoryExt.addEntry · { item with
- content := content
- })
-
- -- For each `worldId` this contains a set of items used in this world
- let mut usedItemsInWorld : HashMap Name (HashSet Name) := {}
-
- -- For each `worldId` this contains a set of items newly defined in this world
- let mut newItemsInWorld : HashMap Name (HashSet Name) := {}
-
- -- Items that should not be displayed in inventory
- let mut hiddenItems : HashSet Name := {}
-
- let allWorlds := game.worlds.nodes.toArray
- let nrWorlds := allWorlds.size
- let mut nrLevels := 0
-
- -- Calculate which "items" are used/new in which world
- for (worldId, world) in allWorlds do
- let mut usedItems : HashSet Name := {}
- let mut newItems : HashSet Name := {}
- for inventoryType in #[.Tactic, .Definition, .Lemma] do
- for (levelId, level) in world.levels.toArray do
- usedItems := usedItems.insertMany (level.getInventory inventoryType).used
- newItems := newItems.insertMany (level.getInventory inventoryType).new
- hiddenItems := hiddenItems.insertMany (level.getInventory inventoryType).hidden
-
- -- if the previous level was named, we need to add it as a new lemma
- if inventoryType == .Lemma then
- match levelId with
- | 0 => pure ()
- | 1 => pure () -- level ids start with 1, so we need to skip 1, too
- | i₀ + 1 =>
- let some idx := world.levels.find? (i₀) | throwError s!"Level {i₀ + 1} not found for world {worldId}!"
- match (idx).statementName with
- | .anonymous => pure ()
- | .num _ _ => panic "Did not expect to get a numerical statement name!"
- | .str pre s =>
- let name := Name.str pre s
- newItems := newItems.insert name
-
- if inventoryType == .Lemma then
-
- -- if the last level was named, we need to add it as a new lemma
- let i₀ := world.levels.size
-
- let some idx := world.levels.find? (i₀) | throwError s!"Level {i₀} not found for world {worldId}!"
- match (idx).statementName with
- | .anonymous => pure ()
- | .num _ _ => panic "Did not expect to get a numerical statement name!"
- | .str pre s =>
- let name := Name.str pre s
- newItems := newItems.insert name
-
- usedItemsInWorld := usedItemsInWorld.insert worldId usedItems
- newItemsInWorld := newItemsInWorld.insert worldId newItems
- -- DEBUG: print new/used items
- -- logInfo m!"{worldId} uses: {usedItems.toList}"
- -- logInfo m!"{worldId} introduces: {newItems.toList}"
-
- -- Moreover, count the number of levels in the game
- nrLevels := nrLevels + world.levels.toArray.size
-
- /- for each "item" this is a HashSet of `worldId`s that introduce this item -/
- let mut worldsWithNewItem : HashMap Name (HashSet Name) := {}
- for (worldId, _world) in allWorlds do
- for newItem in newItemsInWorld.findD worldId {} do
- worldsWithNewItem := worldsWithNewItem.insert newItem $
- (worldsWithNewItem.findD newItem {}).insert worldId
-
- -- For each `worldId` this is a HashSet of `worldId`s that this world depends on.
- let mut worldDependsOnWorlds : HashMap Name (HashSet Name) := {}
-
- -- For a pair of `worldId`s `(id₁, id₂)` this is a HasSet of "items" why `id₁` depends on `id₂`.
- let mut dependencyReasons : HashMap (Name × Name) (HashSet Name) := {}
-
- -- Calculate world dependency graph `game.worlds`
- for (dependentWorldId, _dependentWorld) in allWorlds do
- let mut dependsOnWorlds : HashSet Name := {}
- -- Adding manual dependencies that were specified via the `Dependency` command.
- for (sourceId, targetId) in game.worlds.edges do
- if targetId = dependentWorldId then
- dependsOnWorlds := dependsOnWorlds.insert sourceId
-
- for usedItem in usedItemsInWorld.findD dependentWorldId {} do
- match worldsWithNewItem.find? usedItem with
- | none => logWarning m!"No world introducing {usedItem}, but required by {dependentWorldId}"
- | some worldIds =>
- -- Only need a new dependency if the world does not introduce an item itself
- if !worldIds.contains dependentWorldId then
- -- Add all worlds as dependencies which introduce this item
- -- TODO: Could do something more clever here.
- dependsOnWorlds := dependsOnWorlds.insertMany worldIds
- -- Store the dependency reasons for debugging
- for worldId in worldIds do
- let tmp := (dependencyReasons.findD (dependentWorldId, worldId) {}).insert usedItem
- dependencyReasons := dependencyReasons.insert (dependentWorldId, worldId) tmp
- worldDependsOnWorlds := worldDependsOnWorlds.insert dependentWorldId dependsOnWorlds
-
- -- Debugging: show all dependency reasons if the option `lean4game.showDependencyReasons` is set
- if lean4game.showDependencyReasons.get (← getOptions) then
- for (world, dependencies) in worldDependsOnWorlds.toArray do
- if dependencies.isEmpty then
- logInfo m!"Dependencies of '{world}': none"
- else
- let mut msg := m!"Dependencies of '{world}':"
- for dep in dependencies do
- match dependencyReasons.find? (world, dep) with
- | none =>
- msg := msg ++ m!"\n· '{dep}': no reason found (manually added?)"
- | some items =>
- msg := msg ++ m!"\n· '{dep}' because of:\n {items.toList}"
- logInfo msg
-
- -- Check graph for loops and remove transitive edges
- let loop := findLoops worldDependsOnWorlds
- if loop != [] then
- logError m!"Loop: Dependency graph has a loop: {loop}"
- for i in [:loop.length] do
- let w1 := loop[i]!
- let w2 := loop[if i == loop.length - 1 then 0 else i + 1]!
- match dependencyReasons.find? (w1, w2) with
- -- This should not happen. Could use `find!` again...
- | none => logError m!"Did not find a reason why {w1} depends on {w2}."
- | some items =>
- logError m!"{w1} depends on {w2} because of {items.toList}."
- else
- worldDependsOnWorlds ← removeTransitive worldDependsOnWorlds
-
- -- need to delete all existing edges as they are already present in `worldDependsOnWorlds`.
- modifyCurGame fun game =>
- pure {game with worlds := {game.worlds with edges := Array.empty}}
-
- for (dependentWorldId, worldIds) in worldDependsOnWorlds.toArray do
- modifyCurGame fun game =>
- pure {game with worlds := {game.worlds with
- edges := game.worlds.edges.append (worldIds.toArray.map fun wid => (wid, dependentWorldId))}}
-
- -- Add the number of levels and worlds to the tile for the landing page
- modifyCurGame fun game => pure {game with tile := {game.tile with
- levels := nrLevels
- worlds := nrWorlds }}
-
- -- Apparently we need to reload `game` to get the changes to `game.worlds` we just made
- let game ← getCurGame
-
- let mut allItemsByType : HashMap InventoryType (HashSet Name) := {}
- -- Compute which inventory items are available in which level:
- for inventoryType in #[.Tactic, .Definition, .Lemma] do
-
- -- Which items are introduced in which world?
- let mut lemmaStatements : HashMap (Name × Nat) Name := {}
- -- TODO: I believe `newItemsInWorld` has way to many elements in it which we iterate over
- -- e.g. we iterate over `ring` for `Lemma`s as well, but so far that seems to cause no problems
- let mut allItems : HashSet Name := {}
- for (worldId, world) in game.worlds.nodes.toArray do
- let mut newItems : HashSet Name := {}
- for (levelId, level) in world.levels.toArray do
- let newLemmas := (level.getInventory inventoryType).new
- newItems := newItems.insertMany newLemmas
- allItems := allItems.insertMany newLemmas
- if inventoryType == .Lemma then
- -- For levels `2, 3, …` we check if the previous level was named
- -- in which case we add it as available lemma.
- match levelId with
- | 0 => pure ()
- | 1 => pure () -- level ids start with 1, so we need to skip 1, too.
- | i₀ + 1 =>
- -- add named statement from previous level to the available lemmas.
- let some idx := world.levels.find? (i₀) | throwError s!"Level {i₀ + 1} not found for world {worldId}!"
- match (idx).statementName with
- | .anonymous => pure ()
- | .num _ _ => panic "Did not expect to get a numerical statement name!"
- | .str pre s =>
- let name := Name.str pre s
- newItems := newItems.insert name
- allItems := allItems.insert name
- lemmaStatements := lemmaStatements.insert (worldId, levelId) name
- if inventoryType == .Lemma then
- -- if named, add the lemma from the last level of the world to the inventory
- let i₀ := world.levels.size
- match i₀ with
- | 0 => logWarning m!"World `{worldId}` contains no levels."
- | i₀ =>
- let some idx := world.levels.find? (i₀) | throwError s!"Level {i₀} not found for world {worldId}!"
- match (idx).statementName with
- | .anonymous => pure ()
- | .num _ _ => panic "Did not expect to get a numerical statement name!"
- | .str pre s =>
- let name := Name.str pre s
- newItems := newItems.insert name
- allItems := allItems.insert name
- newItemsInWorld := newItemsInWorld.insert worldId newItems
-
- -- Basic inventory item availability: all locked.
- let Availability₀ : HashMap Name InventoryTile :=
- HashMap.ofList $
- ← allItems.toList.mapM fun item => do
- -- Using a match statement because the error message of `Option.get!` is not helpful.
- match (← getInventoryItem? item inventoryType) with
- | none =>
- -- Note: we did have a panic here before because lemma statement and doc entry
- -- had mismatching namespaces
- logError m!"There is no inventory item ({inventoryType}) for: {item}."
- panic s!"Inventory item {item} not found!"
- | some data =>
- return (item, {
- name := item
- displayName := data.displayName
- category := data.category
- altTitle := data.statement
- hidden := hiddenItems.contains item })
-
-
-
- -- Availability after a given world
- let mut itemsInWorld : HashMap Name (HashMap Name InventoryTile) := {}
- for (worldId, _) in game.worlds.nodes.toArray do
- -- Unlock all items from previous worlds
- let mut items := Availability₀
- let predecessors := game.worlds.predecessors worldId
- -- logInfo m!"Predecessors: {predecessors.toArray.map fun (a) => (a)}"
- for predWorldId in predecessors do
- for item in newItemsInWorld.findD predWorldId {} do
- let data := (← getInventoryItem? item inventoryType).get!
- items := items.insert item {
- name := item
- displayName := data.displayName
- category := data.category
- locked := false
- altTitle := data.statement
- hidden := hiddenItems.contains item }
- itemsInWorld := itemsInWorld.insert worldId items
-
- for (worldId, world) in game.worlds.nodes.toArray do
- let mut items := itemsInWorld.findD worldId {}
-
- let levels := world.levels.toArray.insertionSort fun a b => a.1 < b.1
-
- for (levelId, level) in levels do
- let levelInfo := level.getInventory inventoryType
-
- -- unlock items that are unlocked in this level
- for item in levelInfo.new do
- let data := (← getInventoryItem? item inventoryType).get!
- items := items.insert item {
- name := item
- displayName := data.displayName
- category := data.category
- locked := false
- altTitle := data.statement
- hidden := hiddenItems.contains item }
-
- -- add the exercise statement from the previous level
- -- if it was named
- if inventoryType == .Lemma then
- match lemmaStatements.find? (worldId, levelId) with
- | none => pure ()
- | some name =>
- let data := (← getInventoryItem? name inventoryType).get!
- items := items.insert name {
- name := name
- displayName := data.displayName
- category := data.category
- altTitle := data.statement
- locked := false }
-
- -- add marks for `disabled` and `new` lemmas here, so that they only apply to
- -- the current level.
- let itemsArray := items.toArray
- |>.insertionSort (fun a b => a.1.toString < b.1.toString)
- |>.map (·.2)
- |>.map (fun item => { item with
- disabled := if levelInfo.only.size == 0 then
- levelInfo.disabled.contains item.name
- else
- not (levelInfo.only.contains item.name)
- new := levelInfo.new.contains item.name
- })
-
- modifyLevel ⟨← getCurGameId, worldId, levelId⟩ fun level => do
- return level.setComputedInventory inventoryType itemsArray
- allItemsByType := allItemsByType.insert inventoryType allItems
-
- let getTiles (type : InventoryType) : CommandElabM (Array InventoryTile) := do
- (allItemsByType.findD type {}).toArray.mapM (fun name => do
- let some item ← getInventoryItem? name type
- | throwError "Expected item to exist: {name}"
- return item.toTile)
- let inventory : InventoryOverview := {
- lemmas := (← getTiles .Lemma).map (fun tile => {tile with hidden := hiddenItems.contains tile.name})
- tactics := (← getTiles .Tactic).map (fun tile => {tile with hidden := hiddenItems.contains tile.name})
- definitions := (← getTiles .Definition).map (fun tile => {tile with hidden := hiddenItems.contains tile.name})
- lemmaTab := none
- }
-
- saveGameData allItemsByType inventory
+-- import GameServer.RpcHandlers -- only needed to collect the translations of "level completed" msgs
diff --git a/server/GameServer/Config/SaveData.lean b/server/GameServer/Config/SaveData.lean
new file mode 100644
index 00000000..741390be
--- /dev/null
+++ b/server/GameServer/Config/SaveData.lean
@@ -0,0 +1,25 @@
+import GameServer.Inventory.Basic
+
+/-!
+Used in `GameServer.SaveData` and `GameServerExe.LoadData`.
+-/
+
+namespace GameServer
+
+open Lean
+
+namespace GameData
+
+def gameDataPath : System.FilePath := ".lake" / "gamedata"
+
+def gameFileName := s!"game.json"
+
+set_option linter.unusedVariables false in
+
+def docFileName := fun (inventoryType : InventoryType) (name : Name) => s!"doc__{name}.json"
+
+def levelFileName := fun (worldId : Name) (levelId : Nat) => s!"level__{worldId}__{levelId}.json"
+
+def inventoryFileName := s!"inventory.json"
+
+end GameData
diff --git a/server/GameServer/EnvExtensions.lean b/server/GameServer/EnvExtensions.lean
index 20be5b38..00284d81 100644
--- a/server/GameServer/EnvExtensions.lean
+++ b/server/GameServer/EnvExtensions.lean
@@ -1,16 +1,21 @@
-import GameServer.AbstractCtx
-import GameServer.Graph
-import GameServer.Hints
+import GameServer.Util.AbstractCtx
+import GameServer.Util.Graph
+import GameServer.Tactic.Hint.Defs
+import GameServer.Inventory.Extension
+import GameServer.Layer
open GameServer
-- TODO: Is there a better place?
-/-- Keywords that the server should not consider as tactics. -/
+/-- Keywords that the server should not consider as tactics.
+
+Note: Added `clear` tactic because currently it is very useful in combination with
+`Branch` and `Hint` (i.e. using `clear` before a `Hint` in order to remove any irrelevant
+hypotheses).
+-/
def GameServer.ALLOWED_KEYWORDS : List String :=
- ["with", "fun", "at", "only", "by", "generalizing"]
+ ["with", "fun", "at", "only", "by", "generalizing", "if", "then", "else", "clear", "using"]
-/-- The default game name if `Game "MyGame"` is not used. -/
-def defaultGameName: String := "MyGame"
-- Note: When changing any of these default names, one also needs to change them in `index.mjs`
/-- The default game module name. -/
@@ -24,500 +29,25 @@ defined in this file.
open Lean
-/-! ## Inventory (documentation)
-
-The inventory contains documentation that the user can access.
-There are three inventory types: Lemma, Tactic, Definition. They vary about in the information
-they carry.
-
-The commands `TheoremDoc`, `TacticDoc`, and `DefinitionDoc` add keys and templates to an
-env. extension called `InventoryTemplateExt`. Commands like `NewLemma`, etc. as well as
-`Statement` check if there is a key registered in this extension and might add a default or
-print a warning if not.
-
-Then, `MakeGame` takes the templates from `InventoryTemplateExt` and creates the documentation entries
-that are sent to the client. This allows us to modify them like adding information from
-mathlib or from parsing the lemma in question.
--/
-
-/-- The game knows three different inventory types that contain slightly different information -/
-inductive InventoryType := | Tactic | Lemma | Definition
-deriving ToJson, FromJson, Repr, BEq, Hashable, Inhabited
-
--- TODO: golf this?
-instance : ToString InventoryType := ⟨fun t => match t with
-| .Tactic => "Tactic"
-| .Lemma => "Lemma"
-| .Definition => "Definition"⟩
-
-/-- The keys/templates of the inventory items, stored in `InventoryTemplateExt`. -/
-structure InventoryTemplate where
- /-- Lemma, Tactic, or Definition -/
- type: InventoryType
- /-- Depends on the type:
- * Tactic: the tactic's name
- * Lemma: fully qualified lemma name
- * Definition: no restrictions (preferably the definitions fully qualified name)
- -/
- name: Name
- /-- Only for Lemmas. To sort them into tabs -/
- category: String := default
- /-- Free-text short name -/
- displayName: String := name.toString
- /-- Template documentation. Allows for special tags to insert mathlib info [TODO!] -/
- content: String := ""
- deriving ToJson, Repr, Inhabited
-
-/-- A full inventory item including the processing by `MakeGame`, which creates these
-from the `InventoryTemplate`s and modifies them. -/
-structure InventoryItem extends InventoryTemplate where
- statement: String := ""
- deriving ToJson, Repr, Inhabited
-
-/-- A reduced variant of `InventoryItem` which is used for the tiles in the doc -/
-structure InventoryTile where
- /--
- The name of the item. The restrictions are:
-
- * for Tactics: The name of the tactic.
- * for Lemmas: *Fully qualified* lemma name.
- * for Definitions: no restrictions.
- -/
- name : Name
- /-- The display name shown in the inventory. This can be free-text. -/
- displayName : String
- /-- Category to group inventory items by (currently only used for lemmas). -/
- category : String
- /-- If `true` then the item only gets unlocked in a later level. -/
- locked := true
- /-- If `true` then the item is blocked for this level. -/
- disabled := false
- /-- To mark an item that has been added freshly in this level. -/
- new := false
- /-- hide the item in the inventory display -/
- hidden := false
- /-- hover text -/
- altTitle : String := default
-deriving ToJson, FromJson, Repr, Inhabited
-
-def InventoryItem.toTile (item : InventoryItem) : InventoryTile := {
- name := item.name,
- displayName := item.displayName
- category := item.category
-}
-
-/-- The extension that stores the doc templates. Note that you can only add, but never modify
-entries! -/
-initialize inventoryTemplateExt :
- SimplePersistentEnvExtension InventoryTemplate (Array InventoryTemplate) ←
- registerSimplePersistentEnvExtension {
- name := `inventory_keys
- addEntryFn := Array.push
- addImportedFn := Array.concatMap id }
-
-/-- Receive the template with that matches `(name, type)` -/
-def getInventoryTemplate? [Monad m] [MonadEnv m] (n : Name) (type : InventoryType) :
- m (Option InventoryTemplate) := do
- return (inventoryTemplateExt.getState (← getEnv)).find? (fun x => x.name == n && x.type == type)
-
-/-- The extension that contains the inventory content after it has been processed.
-`MakeGame` is the only command adding items here. -/
-initialize inventoryExt : SimplePersistentEnvExtension InventoryItem (Array InventoryItem) ←
- registerSimplePersistentEnvExtension {
- name := `inventory_doc
- addEntryFn := Array.push
- addImportedFn := Array.concatMap id }
-
-/-- Receive the item with that matches `(name, type)` -/
-def getInventoryItem? [Monad m] [MonadEnv m] (n : Name) (type : InventoryType) :
- m (Option InventoryItem) := do
- return (inventoryExt.getState (← getEnv)).find? (fun x => x.name == n && x.type == type)
+variable {m: Type → Type} [Monad m] [MonadEnv m]
structure InventoryOverview where
tactics : Array InventoryTile
- lemmas : Array InventoryTile
+ theorems : Array InventoryTile
definitions : Array InventoryTile
- lemmaTab : Option String
+ theoremTab : Option String
deriving ToJson, FromJson
-- TODO: Reuse the following code for checking available tactics in user code:
structure UsedInventory where
-(tactics : HashSet Name := {})
-(definitions : HashSet Name := {})
-(lemmas : HashSet Name := {})
-
-/-! ## Environment extensions for game specification -/
-
-/-- Register a (non-persistent) environment extension to hold the current level -/
-initialize curGameExt : EnvExtension (Option Name) ← registerEnvExtension (pure none)
-/-- Register a (non-persistent) environment extension to hold the current level -/
-initialize curWorldExt : EnvExtension (Option Name) ← registerEnvExtension (pure none)
-/-- Register a (non-persistent) environment extension to hold the current level -/
-initialize curLevelExt : EnvExtension (Option Nat) ← registerEnvExtension (pure none)
-
-/--
-A game has three layers: Game, World, Levels. These are set with the commands
-`Game`, `World`, and `Level`. Commands like `Introduction` depend on the current level.
--/
-inductive Layer :=
-| Game | World | Level
-
-variable {m: Type → Type} [Monad m] [MonadEnv m]
-
-/-- Set the current game -/
-def setCurGameId (game : Name) : m Unit :=
- modifyEnv (curGameExt.setState · game)
-
-/-- Set the current world -/
-def setCurWorldId (world : Name) : m Unit :=
- modifyEnv (curWorldExt.setState · world)
-
-/-- Set the current level -/
-def setCurLevelIdx (level : Nat) : m Unit :=
- modifyEnv (curLevelExt.setState · level)
-
-/-- Get the current layer. -/
-def getCurLayer [MonadError m] : m Layer := do
- -- previously, we also had `curGameExt.getState (← getEnv), ` in here, which got removed
- -- when we made the `Game` command optional
- match curWorldExt.getState (← getEnv), curLevelExt.getState (← getEnv) with
- | some _, some _ => return Layer.Level
- | some _, none => return Layer.World
- | none, none => return Layer.Game
- | _, _ => throwError "Invalid Layer"
-
-/-- Get the current game, or default if none is specified -/
-def getCurGameId [Monad m] : m Name := do
- match curGameExt.getState (← getEnv) with
- | some game => return game
- | none => return defaultGameName
-
-/-- Get the current world -/
-def getCurWorldId [MonadError m] : m Name := do
- match curWorldExt.getState (← getEnv) with
- | some world => return world
- | none => throwError "Current world not set"
-
-/-- Get the current level -/
-def getCurLevelIdx [MonadError m] : m Nat := do
- match curLevelExt.getState (← getEnv) with
- | some level => return level
- | none => throwError "Current level not set"
-
-/-! ## Levels -/
-
-structure LevelId where
- game : Name
- world : Name
- level : Nat
-deriving Inhabited
-
-instance : ToString LevelId := ⟨fun id =>
- s!"{id.game}:{id.world}:{id.level}"⟩
-
-structure InventoryInfo where
- /-- inventory items used by the main sample solution of this level -/
- used : Array Name
- /-- new inventory items introduced by this level -/
- new : Array Name
- /-- inventory items that shall not be displayed in the inventory -/
- hidden : Array Name
- /-- inventory items exceptionally forbidden in this level -/
- disabled : Array Name
- /-- only these inventory items are allowed in this level (ignored if empty) -/
- only : Array Name
- /-- inventory items in this level (computed by `MakeGame`) -/
- tiles : Array InventoryTile
-deriving ToJson, FromJson, Repr, Inhabited
-
-def getCurLevelId [MonadError m] : m LevelId := do
- return { game := ← getCurGameId, world := ← getCurWorldId, level := ← getCurLevelIdx}
-
-/-- Instance to make GameLevel Repr work -/
-instance : Repr Elab.Command.Scope := ⟨fun s _ => repr s.currNamespace⟩
-
-
-structure GameLevel where
- index: Nat
- /-- The title of the level. -/
- title: String := default
- /-- Introduction text shown all the time. (markdown) -/
- introduction: String := default
- conclusion: String := default
- /-- The name of the exercise proven. If provided this lemma will be available in
- future levels. -/
- statementName: Name := default
- hints: Array GoalHintEntry := default
- /-- The statement in Lean. -/
- goal : TSyntax `Lean.Parser.Command.declSig := default
- scope : Elab.Command.Scope := default
- /-- The mathematical statement in mathematician-readable form. (markdown) -/
- descrText: Option String := none
- descrFormat : String := default
- /-- The `category` of lemmas to be open by default -/
- lemmaTab: Option String := none
- /-- The module to be imported when playing this level -/
- module : Name := default
- tactics: InventoryInfo := default
- definitions: InventoryInfo := default
- lemmas: InventoryInfo := default
- /-- A proof template that is printed in an empty editor. -/
- template: Option String := none
- /-- The image for this level. -/
- image : String := default
- /-- A sequence of tactics the game automatically executes before the first step. -/
- preamble : TSyntax `Lean.Parser.Tactic.tacticSeq := default
-deriving Inhabited, Repr
-
-/-- Json-encodable version of `GameLevel`
-Fields:
-- description: Lemma in mathematical language.
-- descriptionGoal: Lemma printed as Lean-Code.
--/
-structure LevelInfo where
- index : Nat
- title : String
- tactics : Array InventoryTile
- lemmas : Array InventoryTile
- definitions : Array InventoryTile
- introduction : String
- conclusion : String
- descrText : Option String := none
- descrFormat : String := ""
- lemmaTab : Option String
- module : Name
- displayName : Option String
- statementName : Option String
- template : Option String
- image: Option String
-deriving ToJson, FromJson
-
-def GameLevel.toInfo (lvl : GameLevel) (env : Environment) : LevelInfo :=
- { index := lvl.index,
- title := lvl.title,
- tactics := lvl.tactics.tiles,
- lemmas := lvl.lemmas.tiles,
- definitions := lvl.definitions.tiles,
- descrText := lvl.descrText,
- descrFormat := lvl.descrFormat --toExpr <| format (lvl.goal.raw) --toString <| Syntax.formatStx (lvl.goal.raw) --Syntax.formatStx (lvl.goal.raw) , -- TODO
- introduction := lvl.introduction
- conclusion := lvl.conclusion
- lemmaTab := match lvl.lemmaTab with
- | some tab => tab
- | none =>
- -- Try to set the lemma tab to the category of the first added lemma
- match lvl.lemmas.tiles.find? (·.new) with
- | some tile => tile.category
- | none => none
- statementName := lvl.statementName.toString
- module := lvl.module
- displayName := match lvl.statementName with
- | .anonymous => none
- | name => match (inventoryExt.getState env).find?
- (fun x => x.name == name && x.type == .Lemma) with
- | some n => n.displayName
- | none => name.toString
- -- Note: we could call `.find!` because we check in `Statement` that the
- -- lemma doc must exist.
- template := lvl.template
- image := lvl.image
- }
-
-/-! ## World -/
-
-/-- A world is a collection of levels, like a chapter. -/
-structure World where
- /- Internal name of the world. Not visible to the player. -/
- name: Name
- /-- Display title of the world. -/
- title: String := default
- /-- World introduction to be shown before the first level is loaded. (markdown) -/
- introduction: String := default
- /-- TODO: This is currently unused. -/
- conclusion : String := default
- /-- The levels of the world. -/
- levels: HashMap Nat GameLevel := default
- /-- The introduction image of the world. -/
- image: String := default
-deriving Inhabited
-
-instance : ToJson World := ⟨
- fun world => Json.mkObj [
- ("name", toJson world.name),
- ("title", world.title),
- ("introduction", world.introduction),
- ("image", world.image)]
-⟩
-
-/-! ## Game -/
-
-/-- A tile as they are displayed on the servers landing page. -/
-structure GameTile where
- /-- The title of the game -/
- title: String
- /-- One catch phrase about the game -/
- short: String := default
- /-- One paragraph description what the game is about -/
- long: String := default
- /-- List of languages the game supports
-
- TODO: What's the expectected format
- TODO: Must be a list with a single language currently
- -/
- languages: List String := default
- /-- A list of games which this one builds upon -/
- prerequisites: List String := default
- /-- Number of worlds in the game -/
- worlds: Nat := default
- /-- Number of levels in the game -/
- levels: Nat := default
- /-- A cover image of the game
-
- TODO: What's the format? -/
- image: String := default
-deriving Inhabited, ToJson, FromJson
-
-structure Game where
- /-- Internal name of the game. -/
- name : Name
- /-- TODO: currently unused. -/
- title : String := default
- /-- Text displayed on the main landing page of the game. -/
- introduction : String := default
- /-- Text displayed on the main landing page of the game. -/
- info : String := default
- /-- TODO: currently unused. -/
- conclusion : String := default
- /-- TODO: currently unused. -/
- authors : List String := default
- worlds : Graph Name World := default
- /-- The tile displayed on the server's landing page. -/
- tile : GameTile := default
- /-- The path to the background image of the world. -/
- image : String := default
-deriving Inhabited, ToJson, FromJson
-
-def getGameJson (game : «Game») : Json := Id.run do
- let gameJson : Json := toJson game
- -- Add world sizes to Json object
- let worldSize := game.worlds.nodes.toList.map (fun (n, w) => (n.toString, w.levels.size))
- let gameJson := gameJson.mergeObj (Json.mkObj [("worldSize", Json.mkObj worldSize)])
- return gameJson
-
-/-! ## Game environment extension -/
-
-def HashMap.merge [BEq α] [Hashable α] (old : HashMap α β) (new : HashMap α β) (merge : β → β → β) :
- HashMap α β :=
-new.fold (fun acc a b =>
- if let some bOld := acc.find? a
- then acc.insert a (merge bOld b)
- else acc.insert a b) old
-
-def GameLevel.merge (_old : GameLevel) (new : GameLevel) : GameLevel :=
- new -- simply override old level
-
-def World.merge (old : World) (new : World) : World :=
-{ new with
- levels := HashMap.merge old.levels new.levels GameLevel.merge}
-
-def Game.merge (old : Game) (new : Game) : Game :=
-{ new with
- worlds := {
- nodes := HashMap.merge old.worlds.nodes new.worlds.nodes World.merge
- edges := Id.run do
- let mut res := old.worlds.edges
- for e in new.worlds.edges do
- if ¬ res.contains e then
- res := res.push e
- return res
- } }
-
-initialize gameExt : PersistentEnvExtension (Name × Game) (Name × Game) (HashMap Name Game) ←
- do registerPersistentEnvExtension {
- name := `gameExt,
- mkInitial := pure {},
- addImportedFn := fun ess => do
- let mut games := {}
- for es in ess do
- for (name, game) in es do
- match games.find? name with
- | some oldgame =>
- games := games.insert name (Game.merge oldgame game)
- | none =>
- games := games.insert name game
- return games
- addEntryFn := (λ s n => s.insert n.1 n.2),
- exportEntriesFn := HashMap.toArray,
- statsFn := fun s => format "number of local entries: " ++ format s.size
-}
-
-def getGame? (n : Name) : m (Option Game) := do
- return (gameExt.getState (← getEnv)).find? n
-
-def insertGame (n : Name) (g : Game) : m Unit := do
- modifyEnv (gameExt.addEntry · (n, g))
-
-def getLevel? (levelId : LevelId) : m (Option GameLevel) := do
- let some game ← getGame? levelId.game
- | return none
- let some world := game.worlds.nodes.find? levelId.world
- | return none
- let some level := world.levels.find? levelId.level
- | return none
- return level
-
-def getCurGame [Monad m] : m Game := do
- let some game ← getGame? (← getCurGameId)
- | let game := {name := defaultGameName}
- insertGame defaultGameName game
- return game
- return game
-
-def modifyCurGame (fn : Game → m Game) [MonadError m] : m Unit := do
- let game ← getCurGame
- insertGame game.name (← fn game)
-
-def addWorld (world : World) [MonadError m] : m Unit := do
- modifyCurGame fun game => do
- return {game with worlds := game.worlds.insertNode world.name world}
-
-def getCurWorld [MonadError m] : m World := do
- let some world := (← getCurGame).worlds.nodes.find? (← getCurWorldId)
- | throwError m!"World {← getCurWorldId} does not exist"
- return world
-
-def modifyCurWorld (fn : World → m World) [MonadError m] : m Unit := do
- modifyCurGame fun game => do
- let world ← getCurWorld
- return {game with worlds := {game.worlds with nodes := game.worlds.nodes.insert world.name (← fn world) }}
-
-def addLevel (level : GameLevel) [MonadError m] : m Unit := do
- let worldId ← getCurWorldId
- match ← getLevel? ⟨← getCurGameId, worldId, level.index⟩ with
- | some _existingLevel =>
- throwError m!"Level {level.index} already exists for world {worldId}!"
- | none =>
- modifyCurWorld fun world => do
- return {world with levels := world.levels.insert level.index level}
-
-def getCurLevel [MonadError m] : m GameLevel := do
- let some level := (← getCurWorld).levels.find? (← getCurLevelIdx)
- | throwError m!"Level {← getCurLevelIdx} does not exist"
- return level
+(tactics : Std.HashSet Name := {})
+(definitions : Std.HashSet Name := {})
+(theorems : Std.HashSet Name := {})
-def modifyCurLevel (fn : GameLevel → m GameLevel) [MonadError m] : m Unit := do
- modifyCurWorld fun world => do
- let level ← getCurLevel
- return {world with levels := world.levels.insert level.index (← fn level)}
+-- def getIntroducedInventory (game : Game) [MonadError m] : m (Array Name) := do
+-- let allItems : Array Name := game.worlds.nodes.fold (fun L _ world => L ++
+-- world.levels.fold (fun LL _ level =>
+-- LL ++ level.tactics.new ++ level.theorems.new
+-- ) #[]) #[]
-def modifyLevel (levelId : LevelId) (fn : GameLevel → m GameLevel) [MonadError m] : m Unit := do
- let some game ← getGame? levelId.game
- | throwError m!"Game {levelId.game} does not exist"
- let some world := (← getCurGame).worlds.nodes.find? levelId.world
- | throwError m!"World {levelId.world} does not exist"
- let some level := world.levels.find? levelId.level
- | throwError m!"Level {levelId.level} does not exist"
- let level' ← fn level
- let world' := {world with levels := world.levels.insert levelId.level level'}
- let game' := {game with worlds := game.worlds.insertNode levelId.world world'}
- insertGame levelId.game game'
+-- pure allItems
diff --git a/server/GameServer/FileWorker.lean b/server/GameServer/FileWorker.lean
deleted file mode 100644
index dabb2a14..00000000
--- a/server/GameServer/FileWorker.lean
+++ /dev/null
@@ -1,800 +0,0 @@
-/- This file is adapted from `Lean/Server/FileWorker.lean`. -/
-import Lean.Server.FileWorker
-import GameServer.Game
-import GameServer.ImportModules
-import GameServer.SaveData
-import GameServer.EnvExtensions
-import GameServer.Tactic.LetIntros
-
-namespace MyModule
-
-open Lean
-open Elab
-open Parser
-
-private def mkErrorMessage (c : InputContext) (pos : String.Pos) (errorMsg : String) : Message :=
- let pos := c.fileMap.toPosition pos
- { fileName := c.fileName, pos := pos, data := errorMsg }
-
-private def mkEOI (pos : String.Pos) : Syntax :=
- let atom := mkAtom (SourceInfo.original "".toSubstring pos "".toSubstring pos) ""
- mkNode ``Command.eoi #[atom]
-
-partial def parseTactic (inputCtx : InputContext) (pmctx : ParserModuleContext)
- (mps : ModuleParserState) (messages : MessageLog) :
- Syntax × ModuleParserState × MessageLog × String.Pos := Id.run do
- let mut pos := mps.pos
- let mut recovering := mps.recovering
- let mut messages := messages
- let mut stx := Syntax.missing -- will always be assigned below
-
- let tokens := getTokenTable pmctx.env
-
- let s := whitespace.run inputCtx pmctx tokens { cache := initCacheForInput inputCtx.input, pos }
- let endOfWhitespace := s.pos
-
- let p := (Tactic.sepByIndentSemicolon tacticParser).fn
- let s := p.run inputCtx pmctx tokens { cache := initCacheForInput inputCtx.input, pos }
-
- pos := s.pos
- match s.errorMsg with
- | none =>
- stx := s.stxStack.back
- recovering := false
- | some errorMsg =>
- messages := messages.add <| mkErrorMessage inputCtx s.pos (toString errorMsg)
- recovering := true
- stx := s.stxStack.back
- if ¬ inputCtx.input.atEnd s.pos then
- messages := messages.add <| mkErrorMessage inputCtx s.pos "end of input"
- return (stx, { pos := inputCtx.input.endPos, recovering }, messages, endOfWhitespace)
-
-end MyModule
-
-namespace GameServer.FileWorker
-
-open Lean
-open Lean.Server
-open Lean.Server.FileWorker
-open Lsp
-open IO
-open Snapshots
-open JsonRpc
-
-/--
-Game-specific state to be packed on top of the `Server.FileWorker.WorkerState`
-used by the Lean server.
--/
-structure WorkerState :=
- /--
- Collection of items which are considered unlocked.
- Tactics and theorems are mixed together.
- -/
- inventory : Array String
- /--
- Difficulty determines whether tactics/theorems can be locked.
- * 0: do not check
- * 1: give warnings when locked items are used
- * 2: give errors when locked items are used
- -/
- difficulty : Nat
- /--
- `levelInfo` contains all the (static) information about the level which is not influenced
- by the user's progress.
- -/
- levelInfo : LevelInfo
-deriving ToJson, FromJson
-
-/--
-Pack the our custom `WorkerState` on top of the normal worker monad
-`Server.FileWorker.WorkerM`.
--/
-abbrev WorkerM := StateT WorkerState Server.FileWorker.WorkerM
-
-section Elab
-
-/-- Add a message. use `(severity := .warning)` to specify the severity-/
-def addMessage (info : SourceInfo) (inputCtx : Parser.InputContext)
- (severity := MessageSeverity.warning) (s : MessageData) :
- Elab.Command.CommandElabM Unit := do
- modify fun st => { st with
- messages := st.messages.add {
- fileName := inputCtx.fileName
- severity := severity
- pos := inputCtx.fileMap.toPosition (info.getPos?.getD 0)
- data := s }}
-
--- TODO: use HashSet for allowed tactics?
-/--
-Find all tactics in syntax object that are forbidden according to a
-set `allowed` of allowed tactics.
--/
-partial def findForbiddenTactics (inputCtx : Parser.InputContext) (workerState : WorkerState)
- (stx : Syntax) : Elab.Command.CommandElabM Unit := do
- let levelInfo := workerState.levelInfo
- -- Parse the syntax object and look for tactics and declarations.
- match stx with
- | .missing => return ()
- | .node _info _kind args =>
- -- Go inside a node.
- for arg in args do
- findForbiddenTactics inputCtx workerState arg
- | .atom info val =>
- -- Atoms might be tactic names or other keywords.
- -- Note: We whitelisted known keywords because we cannot
- -- distinguish keywords from tactic names.
- let allowed := GameServer.ALLOWED_KEYWORDS
- -- Ignore syntax elements that do not start with a letter or are listed above.
- if 0 < val.length ∧ val.data[0]!.isAlpha ∧ not (allowed.contains val) then
- -- Treat `simp?` and `simp!` like `simp`
- let val := val.dropRightWhile (fun c => c == '!' || c == '?')
- match levelInfo.tactics.find? (·.name.toString == val) with
- | none =>
- -- Tactic will never be introduced in the game.
- match workerState.inventory.find? (· == val) with
- | some _ =>
- -- Tactic is in the inventory, allow it.
- -- Note: This case shouldn't be possible...
- pure ()
- | none =>
- -- Tactic is not in the inventory.
- addMessageByDifficulty info s!"The tactic '{val}' is not available in this game!"
- | some tac =>
- -- Tactic is introduced at some point in the game.
- if tac.disabled then
- -- Tactic is disabled in this level.
- addMessageByDifficulty info s!"The tactic '{val}' is disabled in this level!"
- else if tac.locked then
- match workerState.inventory.find? (· == val) with
- | none =>
- -- Tactic is marked as locked and not in the inventory.
- addMessageByDifficulty info s!"You have not unlocked the tactic '{val}' yet!"
- | some _ =>
- -- Tactic is in the inventory, allow it.
- pure ()
- | .ident info _rawVal val _preresolved =>
- -- Try to resolve the name
- let ns ←
- try resolveGlobalConst (mkIdent val)
- -- Catch "unknown constant" error
- catch | _ => pure []
- for n in ns do
- let some (.thmInfo ..) := (← getEnv).find? n
- -- Not a theorem, no checks needed.
- | return ()
- if some n = levelInfo.statementName then
- -- Forbid the theorem we are proving currently
- addMessage info inputCtx (severity := .error)
- s!"Structural recursion: you can't use '{n}' to proof itself!"
- let theoremsAndDefs := levelInfo.lemmas ++ levelInfo.definitions
- match theoremsAndDefs.find? (·.name == n) with
- | none =>
- -- Theorem will never be introduced in this game
- addMessageByDifficulty info s!"The theorem/definition '{n}' is not available in this game!"
- | some thm =>
- -- Theorem is introduced at some point in the game.
- if thm.disabled then
- -- Theorem is disabled in this level.
- addMessageByDifficulty info s!"The theorem/definition '{n}' is disabled in this level!"
- else if thm.locked then
- match workerState.inventory.find? (· == n.toString) with
- | none =>
- -- Theorem is still locked.
- addMessageByDifficulty info s!"You have not unlocked the theorem/definition '{n}' yet!"
- | some _ =>
- -- Theorem is in the inventory, allow it.
- pure ()
-
-where addMessageByDifficulty (info : SourceInfo) (s : MessageData) :=
- -- See `GameServer.FileWorker.WorkerState.difficulty`. Send nothing/warnings/errors
- -- depending on difficulty.
- let difficulty := workerState.difficulty
- if difficulty > 0 then
- addMessage info inputCtx (if difficulty > 1 then .error else .warning) s
- else pure ()
-
-open Elab Meta Expr in
-
-def compileProof (inputCtx : Parser.InputContext) (snap : Snapshot) (hasWidgets : Bool)
- (couldBeEndSnap : Bool) (gameWorkerState : WorkerState)
- (initParams : Lsp.InitializeParams) : IO Snapshot := do
- -- Recognize end snap
- if inputCtx.input.atEnd snap.mpState.pos ∧ couldBeEndSnap then
- let endSnap : Snapshot := {
- beginPos := snap.mpState.pos
- stx := MyModule.mkEOI snap.mpState.pos
- mpState := snap.mpState
- cmdState := snap.cmdState
- interactiveDiags := ← withNewInteractiveDiags snap.msgLog
- tacticCache := snap.tacticCache
- }
- return endSnap
-
- let parseResultRef ← IO.mkRef (Syntax.missing, snap.mpState)
-
- let cmdStateRef ← IO.mkRef snap.cmdState
- /- The same snapshot may be executed by different tasks. So, to make sure `elabCommandTopLevel` has exclusive
- access to the cache, we create a fresh reference here. Before this change, the
- following `snap.tacticCache.modify` would reset the tactic post cache while another snapshot was still using it. -/
- let tacticCacheNew ← IO.mkRef (← snap.tacticCache.get)
- let cmdCtx : Elab.Command.Context := {
- cmdPos := snap.endPos
- fileName := inputCtx.fileName
- fileMap := inputCtx.fileMap
- tacticCache? := some tacticCacheNew
- }
- let (output, _) ← IO.FS.withIsolatedStreams (isolateStderr := server.stderrAsMessages.get snap.cmdState.scopes.head!.opts) <| liftM (m := BaseIO) do
- Elab.Command.catchExceptions
- (getResetInfoTrees *> do
- let some level ← GameServer.getLevelByFileName? initParams inputCtx.fileName
- | panic! s!"Level not found: {inputCtx.fileName} / {GameServer.levelIdFromFileName? initParams inputCtx.fileName}"
- let scope := level.scope
-
- -- use open namespaces and options as in the level file
- Elab.Command.withScope (fun _ => scope) do
- for od in scope.openDecls do
- let .simple ns _ := od
- | pure ()
- activateScoped ns
- activateScoped scope.currNamespace
-
- -- parse tactics
- let pmctx := {
- env := ← getEnv,
- options := scope.opts,
- currNamespace := scope.currNamespace,
- openDecls := scope.openDecls }
- let (tacticStx, cmdParserState, msgLog, endOfWhitespace) :=
- MyModule.parseTactic inputCtx pmctx snap.mpState snap.msgLog
- modify (fun s => { s with messages := msgLog })
- parseResultRef.set (tacticStx, cmdParserState)
-
- -- Check for forbidden tactics
- findForbiddenTactics inputCtx gameWorkerState tacticStx
-
- -- Insert invisible `skip` command to make sure we always display the initial goal
- let skip := Syntax.node (.original default 0 default endOfWhitespace) ``Lean.Parser.Tactic.skip #[]
- -- Insert final `done` command to display unsolved goal error in the end
- let done := Syntax.node (.synthetic cmdParserState.pos cmdParserState.pos) ``Lean.Parser.Tactic.done #[]
- let tacticStx := (#[skip] ++ tacticStx.getArgs ++ #[done]).map (⟨.⟩)
- let tacticStx := ← `(Lean.Parser.Tactic.tacticSeq| $[$(tacticStx)]*)
-
- -- Always call `let_intros` to get rid `let` statements in the goal.
- -- This makes the experience for the user much nicer and allows for local
- -- definitions in the exercise.
- let cmdStx ← `(command|
- theorem the_theorem $(level.goal) := by {let_intros; $(⟨level.preamble⟩); $(⟨tacticStx⟩)} )
- Elab.Command.elabCommandTopLevel cmdStx)
- cmdCtx cmdStateRef
- let postNew := (← tacticCacheNew.get).post
- snap.tacticCache.modify fun _ => { pre := postNew, post := {} }
- let mut postCmdState ← cmdStateRef.get
- if !output.isEmpty then
- postCmdState := {
- postCmdState with
- messages := postCmdState.messages.add {
- fileName := inputCtx.fileName
- severity := MessageSeverity.information
- pos := inputCtx.fileMap.toPosition snap.endPos
- data := output
- }
- }
-
- let (tacticStx, cmdParserState) ← parseResultRef.get
- if tacticStx.isMissing then throwServerError "Tactic execution went wrong. No stx found."
-
- let postCmdSnap : Snapshot := {
- beginPos := tacticStx.getPos?.getD 0
- stx := tacticStx
- mpState := cmdParserState
- cmdState := postCmdState
- interactiveDiags := ← withNewInteractiveDiags postCmdState.messages
- tacticCache := (← IO.mkRef {})
- }
- return postCmdSnap
-
-where
- /-- Compute the current interactive diagnostics log by finding a "diff" relative to the parent
- snapshot. We need to do this because unlike the `MessageLog` itself, interactive diags are not
- part of the command state. -/
- withNewInteractiveDiags (msgLog : MessageLog) : IO (PersistentArray Widget.InteractiveDiagnostic) := do
- let newMsgCount := msgLog.msgs.size - snap.msgLog.msgs.size
- let mut ret := snap.interactiveDiags
- for i in List.iota newMsgCount do
- let newMsg := msgLog.msgs.get! (msgLog.msgs.size - i)
- ret := ret.push (← Widget.msgToInteractiveDiagnostic inputCtx.fileMap newMsg hasWidgets)
- return ret
-
- private def publishIleanInfo (method : String) (m : DocumentMeta) (hOut : FS.Stream)
- (snaps : Array Snapshot) : IO Unit := do
- let trees := snaps.map fun snap => snap.infoTree
- let references ← findModuleRefs m.text trees (localVars := true) |>.toLspModuleRefs
- let param := { version := m.version, references : LeanIleanInfoParams }
- hOut.writeLspNotification { method, param }
-
- private def publishIleanInfoUpdate : DocumentMeta → FS.Stream → Array Snapshot → IO Unit :=
- publishIleanInfo "$/lean/ileanInfoUpdate"
-
- private def publishIleanInfoFinal : DocumentMeta → FS.Stream → Array Snapshot → IO Unit :=
- publishIleanInfo "$/lean/ileanInfoFinal"
-
- structure GameCompletedParams where
- uri : String
- deriving ToJson, FromJson
-
-structure GameDiagnostics where
- diagnostics : List Diagnostic
-deriving ToJson, FromJson
-
-structure GameParams where
- uri : String
- diagnostics : GameDiagnostics
-deriving ToJson, FromJson
-
--- `snap` and `initParams` are unused
-set_option linter.unusedVariables false in
-
-/-- WIP: publish diagnostics, all intermediate goals and if the game is completed. -/
-def publishProofState (m : DocumentMeta) (snap : Snapshot) (initParams : Lsp.InitializeParams) (hOut : FS.Stream) :
- IO Unit := do
- -- let text := m.text
-
- -- -- `snap` is the one snapshot containing the entire proof.
- -- let mut goals : Array <| InteractiveGoalsWithHints := #[]
- -- for pos in text.positions do
- -- let source := text.getLineBefore pos
- -- -- iterate over all newlines in the proof and get the goals and hints at each position
- -- if let goalsAtResult@(_ :: _) := snap.infoTree.goalsAt? text pos then
- -- pure ()
- -- let goalAtPos : List <| List InteractiveGoalWithHints ← goalsAtResult.mapM
- -- fun { ctxInfo := ci, tacticInfo := tacticInfo, useAfter := useAfter, .. } => do
- -- -- TODO: What does this function body do?
- -- -- let ciAfter := { ci with mctx := ti.mctxAfter }
- -- let ci := if useAfter then
- -- { ci with mctx := tacticInfo.mctxAfter }
- -- else
- -- { ci with mctx := tacticInfo.mctxBefore }
- -- -- compute the interactive goals
- -- let goalMvars : List MVarId ← ci.runMetaM {} do
- -- return if useAfter then tacticInfo.goalsAfter else tacticInfo.goalsBefore
-
- -- let interactiveGoals : List InteractiveGoalWithHints ← ci.runMetaM {} do
- -- goalMvars.mapM fun goal => do
- -- let hints ← findHints goal m initParams
- -- let interactiveGoal ← goalToInteractive goal
- -- return ⟨interactiveGoal, hints⟩
- -- -- TODO: This code is way old, can it be deleted?
- -- -- compute the goal diff
- -- -- let goals ← ciAfter.runMetaM {} (do
- -- -- try
- -- -- Widget.diffInteractiveGoals useAfter ti goals
- -- -- catch _ =>
- -- -- -- fail silently, since this is just a bonus feature
- -- -- return goals
- -- -- )
- -- return interactiveGoals
- -- let goalAtPos : Array InteractiveGoalWithHints := ⟨goalAtPos.foldl (· ++ ·) []⟩
- -- goals := goals.push ⟨goalAtPos, source⟩
- -- else
- -- -- No goals present
- -- goals := goals.push default
-
- -- -- Question: Is there a difference between the diags of this snap and the last snap?
- -- -- Should we get the diags from there?
- -- let diag : Array Widget.InteractiveDiagnostic := snap.interactiveDiags.toArray
-
- -- -- Level is completed if there are no errors or warnings
- -- let completed : Bool := ¬ diag.any (fun d =>
- -- d.severity? == some .error ∨ d.severity? == some .warning)
-
- -- let param : ProofState := {
- -- steps := goals,
- -- diagnostics := diag,
- -- completed := completed }
-
- -- TODO
- let param := { uri := m.uri : GameCompletedParams}
-
-
- hOut.writeLspNotification { method := "$/game/publishProofState", param }
-
-/-- Checks whether game level has been completed and sends a notification to the client -/
-def publishGameCompleted (m : DocumentMeta) (hOut : FS.Stream) (snaps : Array Snapshot) : IO Unit := do
- -- check if there is any error or warning
- for snap in snaps do
- if snap.diagnostics.any fun d => d.severity? == some .error ∨ d.severity? == some .warning
- then return
- let param := { uri := m.uri : GameCompletedParams}
- hOut.writeLspNotification { method := "$/game/completed", param }
-
-/-- copied from `Lean.Server.FileWorker.nextCmdSnap`. -/
--- @[inherit_doc Lean.Server.FileWorker.nextCmdSnap] -- cannot inherit from private
-private def nextCmdSnap (ctx : WorkerContext) (m : DocumentMeta) (cancelTk : CancelToken)
- (gameWorkerState : WorkerState) (initParams : Lsp.InitializeParams) :
- AsyncElabM (Option Snapshot) := do
- cancelTk.check
- let s ← get
- let .some lastSnap := s.snaps.back? | panic! "empty snapshots"
- if lastSnap.isAtEnd then
- publishDiagnostics m lastSnap.diagnostics.toArray ctx.hOut
- publishProgressDone m ctx.hOut
- publishIleanInfoFinal m ctx.hOut s.snaps
- return none
- publishProgressAtPos m lastSnap.endPos ctx.hOut
-
- -- (modified part)
- -- Make sure that there is at least one snap after the head snap, so that
- -- we can see the current goal even on an empty document
- let couldBeEndSnap := s.snaps.size > 1
- let snap ← compileProof m.mkInputContext lastSnap ctx.clientHasWidgets couldBeEndSnap
- gameWorkerState initParams
-
- set { s with snaps := s.snaps.push snap }
- cancelTk.check
- -- publishProofState m snap initParams ctx.hOut
- publishDiagnostics m snap.diagnostics.toArray ctx.hOut
- publishIleanInfoUpdate m ctx.hOut #[snap]
- return some snap
-
--- Copied from `Lean.Server.FileWorker.unfoldCmdSnaps` using our own `nextCmdSnap`.
-@[inherit_doc Lean.Server.FileWorker.unfoldCmdSnaps]
-def unfoldCmdSnaps (m : DocumentMeta) (snaps : Array Snapshot) (cancelTk : CancelToken)
- (startAfterMs : UInt32) (gameWorkerState : WorkerState)
- : ReaderT WorkerContext IO (AsyncList ElabTaskError Snapshot) := do
- let ctx ← read
- let some headerSnap := snaps[0]? | panic! "empty snapshots"
- if headerSnap.msgLog.hasErrors then
- publishProgressAtPos m headerSnap.beginPos ctx.hOut (kind := LeanFileProgressKind.fatalError)
- publishIleanInfoFinal m ctx.hOut #[headerSnap]
- return AsyncList.ofList [headerSnap]
- else
- publishIleanInfoUpdate m ctx.hOut snaps
- return AsyncList.ofList snaps.toList ++ AsyncList.delayed (← EIO.asTask (ε := ElabTaskError) (prio := .dedicated) do
- IO.sleep startAfterMs
- AsyncList.unfoldAsync (nextCmdSnap ctx m cancelTk gameWorkerState ctx.initParams) { snaps })
-
-end Elab
-
-section Updates
-
-/-- Given the new document, updates editable doc state. -/
-def updateDocument (newMeta : DocumentMeta) : WorkerM Unit := do
- let s ← get
- let ctx ← read
- let oldDoc := (← StateT.lift get).doc
- oldDoc.cancelTk.set
- let initHeaderStx := (← StateT.lift get).initHeaderStx
- let (newHeaderStx, newMpState, _) ← Parser.parseHeader newMeta.mkInputContext
- let cancelTk ← CancelToken.new
- let headSnapTask := oldDoc.cmdSnaps.waitHead?
- let newSnaps ← if initHeaderStx != newHeaderStx then
- EIO.asTask (ε := ElabTaskError) (prio := .dedicated) do
- IO.sleep ctx.initParams.editDelay.toUInt32
- cancelTk.check
- IO.Process.exit 2
- else EIO.mapTask (ε := ElabTaskError) (t := headSnapTask) (prio := .dedicated) fun headSnap?? => do
- -- There is always at least one snapshot absent exceptions
- let some headSnap ← MonadExcept.ofExcept headSnap?? | panic! "empty snapshots"
- let newHeaderSnap := { headSnap with stx := newHeaderStx, mpState := newMpState }
- let changePos := oldDoc.meta.text.source.firstDiffPos newMeta.text.source
- -- Ignore exceptions, we are only interested in the successful snapshots
- let (cmdSnaps, _) ← oldDoc.cmdSnaps.getFinishedPrefix
- -- NOTE(WN): we invalidate eagerly as `endPos` consumes input greedily. To re-elaborate only
- -- when really necessary, we could do a whitespace-aware `Syntax` comparison instead.
- let mut validSnaps ← pure (cmdSnaps.takeWhile (fun s => s.endPos < changePos))
- if h : validSnaps.length ≤ 1 then
- validSnaps := [newHeaderSnap]
- else
- /- When at least one valid non-header snap exists, it may happen that a change does not fall
- within the syntactic range of that last snap but still modifies it by appending tokens.
- We check for this here. We do not currently handle crazy grammars in which an appended
- token can merge two or more previous commands into one. To do so would require reparsing
- the entire file. -/
- have : validSnaps.length ≥ 2 := Nat.gt_of_not_le h
- let mut lastSnap := validSnaps.getLast (by subst ·; simp at h)
- let preLastSnap :=
- have : 0 < validSnaps.length := Nat.lt_of_lt_of_le (by decide) this
- have : validSnaps.length - 2 < validSnaps.length := Nat.sub_lt this (by decide)
- validSnaps[validSnaps.length - 2]
- let newLastStx ← parseNextCmd newMeta.mkInputContext preLastSnap
- if newLastStx != lastSnap.stx then
- validSnaps := validSnaps.dropLast
- -- wait for a bit, giving the initial `cancelTk.check` in `nextCmdSnap` time to trigger
- -- before kicking off any expensive elaboration (TODO: make expensive elaboration cancelable)
- unfoldCmdSnaps newMeta validSnaps.toArray cancelTk s ctx
- (startAfterMs := ctx.initParams.editDelay.toUInt32)
- StateT.lift <| modify fun st => { st with
- doc := { meta := newMeta, cmdSnaps := AsyncList.delayed newSnaps, cancelTk }}
-
-end Updates
-
-section Initialization
-
-def DocumentMeta.mkInputContext (doc : DocumentMeta) : Parser.InputContext where
- input := "" -- No header!
- fileName := (System.Uri.fileUriToPath? doc.uri).getD doc.uri |>.toString
- fileMap := default
-
-/-- `gameDir` and `module` were added.
-
-TODO: In general this resembles little similarity with the
-original code, and I don't know why...
--/
--- @[inherit_doc Lean.Server.FileWorker.compileHeader]
-def compileHeader (m : DocumentMeta) (hOut : FS.Stream) (opts : Options) (hasWidgets : Bool)
- (gameDir : String) (module : Name):
- IO (Syntax × Task (Except Error (Snapshot × SearchPath))) := do
- -- Determine search paths of the game project by running `lake env printenv LEAN_PATH`.
- let out ← IO.Process.output
- { cwd := gameDir, cmd := "lake", args := #["env","printenv","LEAN_PATH"] }
- if out.exitCode != 0 then
- throwServerError s!"Error while running Lake: {out.stderr}"
-
- -- Make the paths relative to the current directory
- let paths : List System.FilePath := System.SearchPath.parse out.stdout.trim
- let currentDir ← IO.currentDir
- let paths := paths.map fun p => currentDir / (gameDir : System.FilePath) / p
-
- -- Set the search path
- Lean.searchPathRef.set paths
-
- let env ← importModules' #[{ module := `Init : Import }, { module := module : Import }]
-
- -- use empty header
- let (headerStx, headerParserState, msgLog) ← Parser.parseHeader
- {m.mkInputContext with
- input := ""
- fileMap := FileMap.ofString ""}
- (headerStx, ·) <$> EIO.asTask do
- let mut srcSearchPath : SearchPath := paths --← initSrcSearchPath (← getBuildDir)
- let headerEnv := env
- let mut headerEnv := headerEnv
- try
- if let some path := System.Uri.fileUriToPath? m.uri then
- headerEnv := headerEnv.setMainModule (← moduleNameOfFileName path none)
- catch _ => pure ()
- let cmdState := Elab.Command.mkState headerEnv {} opts
- let cmdState := { cmdState with infoState := {
- enabled := true
- trees := #[Elab.InfoTree.context (.commandCtx {
- env := headerEnv
- fileMap := m.text
- ngen := { namePrefix := `_worker }
- }) (Elab.InfoTree.node
- (Elab.Info.ofCommandInfo { elaborator := `header, stx := headerStx })
- (headerStx[1].getArgs.toList.map (fun importStx =>
- Elab.InfoTree.node (Elab.Info.ofCommandInfo {
- elaborator := `import
- stx := importStx
- }) #[].toPArray'
- )).toPArray'
- )].toPArray'
- }}
- let headerSnap := {
- beginPos := 0
- stx := headerStx
- mpState := {} -- was `headerParserState`
- cmdState := cmdState
- interactiveDiags := ← cmdState.messages.msgs.mapM (Widget.msgToInteractiveDiagnostic m.text · hasWidgets)
- tacticCache := (← IO.mkRef {})
- }
- publishDiagnostics m headerSnap.diagnostics.toArray hOut
- return (headerSnap, srcSearchPath)
-
-/-- Copied from `Lean.Server.FileWorker.initializeWorker`. Added `gameDir` and
-`gameWorkerState` arguments and use custom `unfoldCmdSnaps`. -/
--- @[inherit_doc Lean.Server.FileWorker.initializeWorker]
-def initializeWorker (meta : DocumentMeta) (i o e : FS.Stream) (initParams : InitializeParams) (opts : Options)
- (gameDir : String) (gameWorkerState : WorkerState) : IO (WorkerContext × Server.FileWorker.WorkerState) := do
- let clientHasWidgets := initParams.initializationOptions?.bind (·.hasWidgets?) |>.getD false
- let (headerStx, headerTask) ← compileHeader meta o opts (hasWidgets := clientHasWidgets)
- (gameDir := gameDir) (module := gameWorkerState.levelInfo.module)
- let cancelTk ← CancelToken.new
- let ctx := {
- hIn := i
- hOut := o
- hLog := e
- headerTask
- initParams
- clientHasWidgets
- }
- let cmdSnaps ← EIO.mapTask (t := headerTask) (match · with
- | Except.ok (s, _) => unfoldCmdSnaps meta #[s] cancelTk gameWorkerState ctx (startAfterMs := 0)
- | Except.error e => throw (e : ElabTaskError))
- let doc : EditableDocument := { meta, cmdSnaps := AsyncList.delayed cmdSnaps, cancelTk }
- return (ctx, {
- doc := doc
- initHeaderStx := headerStx
- currHeaderStx := headerStx
- importCachingTask? := none
- pendingRequests := RBMap.empty
- rpcSessions := RBMap.empty
- })
-
-end Initialization
-
-section NotificationHandling
-
-/-- Copied from `Lean.Server.FileWorker.handleDidChange` but with our custom `WorkerM` and
-`updateDocument` -/
--- @[inherit_doc Lean.Server.FileWorker.handleDidChange]
-def handleDidChange (p : DidChangeTextDocumentParams) : WorkerM Unit := do
- let docId := p.textDocument
- let changes := p.contentChanges
- let oldDoc := (← StateT.lift get).doc -- needed a lift to our custom `WorkerM`
- let newVersion := docId.version?.getD 0
- if ¬ changes.isEmpty then
- let newDocText := foldDocumentChanges changes oldDoc.meta.text
- -- modification: set the `DependencyBuildMode` from
- -- `oldDoc.meta.dependencyBuildMode` to `.always`
- updateDocument ⟨docId.uri, newVersion, newDocText, .always⟩
-
-end NotificationHandling
-
-section MessageHandling
-
-
-/--
-Modified notification handler.
-
-Compare to `Lean.Server.FileWorker.handleNotification`.
-We use the modified `WorkerM` and use our custom `handleDidChange`.
-
--/
-def handleNotification (method : String) (params : Json) : WorkerM Unit := do
- let handle := fun paramType [FromJson paramType] (handler : paramType → WorkerM Unit) =>
- (StateT.lift <| parseParams paramType params) >>= handler
- match method with
- -- Modified `textDocument/didChange`, using a custom `handleDidChange`
- | "textDocument/didChange" => handle DidChangeTextDocumentParams (handleDidChange)
- -- unmodified
- | "$/cancelRequest" => handle CancelParams (handleCancelRequest ·)
- -- unmodified
- | "$/lean/rpc/release" => handle RpcReleaseParams (handleRpcRelease ·)
- -- unmodified
- | "$/lean/rpc/keepAlive" => handle RpcKeepAliveParams (handleRpcKeepAlive ·)
- -- New. TODO: What is this for?
- | "$/setTrace" => pure ()
- | _ => throwServerError s!"Got unsupported notification method: {method}"
-
-end MessageHandling
-
-section MainLoop
-
-/--
-The main-loop. Copied from `Lean.Server.FileWorker.mainLoop`. Use custom `WorkerM` as well
-as custom `handleNotification`.
--/
---@[inherit_doc Lean.Server.FileWorker.mainLoop]
-partial def mainLoop : WorkerM Unit := do
- let ctx ← read
- let mut st ← StateT.lift get
- let msg ← ctx.hIn.readLspMessage
- -- Erase finished tasks if there are no errors.
- let filterFinishedTasks (acc : PendingRequestMap) (id : RequestID) (task : Task (Except IO.Error Unit))
- : IO PendingRequestMap := do
- if (← hasFinished task) then
- if let Except.error e := task.get then
- throwServerError s!"Failed responding to request {id}: {e}"
- pure <| acc.erase id
- else pure acc
- let pendingRequests ← st.pendingRequests.foldM (fun acc id task => filterFinishedTasks acc id task) st.pendingRequests
- st := { st with pendingRequests }
- for (id, seshRef) in st.rpcSessions do
- let sesh ← seshRef.get
- if (← sesh.hasExpired) then
- st := { st with rpcSessions := st.rpcSessions.erase id }
-
- set st
- -- Process the RPC-message and restart main-loop.
- match msg with
- | Message.request id "shutdown" none =>
- --added. TODO: why do we need that? Or has it just removed in Lean since when we started?
- ctx.hOut.writeLspResponse ⟨id, Json.null⟩
- mainLoop
- | Message.request id method (some params) =>
- -- Requests are handled by the unmodified lean server.
- handleRequest id method (toJson params)
- mainLoop
- | Message.notification "exit" none =>
- let doc := st.doc
- doc.cancelTk.set
- doc.cmdSnaps.cancel
- return ()
- | Message.notification method (some params) =>
- -- Custom notification handler
- handleNotification method (toJson params)
- mainLoop
- | _ =>
- throwServerError s!"Got invalid JSON-RPC message: {toJson msg}"
-
-end MainLoop
-
-/-- Modified from `Lean.Server.FileWorker.initAndRunWorker`.
-Added `gameDir` argument, -/
--- @[inherit_doc Lean.Server.FileWorker.initAndRunWorker]
-def initAndRunWorker (i o e : FS.Stream) (opts : Options) (gameDir : String) : IO UInt32 := do
- let i ← maybeTee "fwIn.txt" false i
- let o ← maybeTee "fwOut.txt" true o
-
-
- -- BIG MODIFICATION
- let initRequest ← i.readLspRequestAs "initialize" Game.InitializeParams
- o.writeLspResponse {
- id := initRequest.id
- result := {
- capabilities := Watchdog.mkLeanServerCapabilities
- serverInfo? := some {
- name := "Lean 4 Game Server"
- version? := "0.1.1"
- }
- : InitializeResult
- }
- }
- discard $ i.readLspNotificationAs "initialized" InitializedParams
- let ⟨_, param⟩ ← i.readLspNotificationAs "textDocument/didOpen" DidOpenTextDocumentParams
-
-
- let doc := param.textDocument
- -- modification: using `.always`
- let meta : DocumentMeta := ⟨doc.uri, doc.version, doc.text.toFileMap, .always⟩
- let e := e.withPrefix s!"[{param.textDocument.uri}] "
- let _ ← IO.setStderr e
- try
-
-
- -- BIG MODIFICATION
- let game ← loadGameData gameDir
- -- TODO: We misuse the `rootUri` field to the gameName
- let rootUri? : Option String := some (toString game.name)
- let initParams := {initRequest.param.toLeanInternal with rootUri?}
- let some (levelId : LevelId) := GameServer.levelIdFromFileName?
- initParams meta.mkInputContext.fileName
- | throwServerError s!"Could not determine level ID: {meta.mkInputContext.fileName}"
- let levelInfo ← loadLevelData gameDir levelId.world levelId.level
- let some initializationOptions := initRequest.param.initializationOptions?
- | throwServerError "no initialization options found"
- let gameWorkerState : WorkerState := {
- inventory := initializationOptions.inventory
- difficulty := initializationOptions.difficulty
- levelInfo
- }
- let (ctx, st) ← initializeWorker meta i o e initParams opts gameDir gameWorkerState
- -- Run the main loop
- let _ ← StateRefT'.run (s := st) <| ReaderT.run (r := ctx) <|
- StateT.run (s := gameWorkerState) <| (mainLoop)
-
-
- return (0 : UInt32)
- catch e =>
- IO.eprintln e
- publishDiagnostics meta #[{
- range := ⟨⟨0, 0⟩, ⟨0, 0⟩⟩,
- severity? := DiagnosticSeverity.error,
- message := e.toString }] o
- return (1 : UInt32)
-
-/--
-The main function. Simply wrapping `initAndRunWorker`.
-
-Copied from `Lean.Server.FileWorker.workerMain`. We add `args` as an argument to pass on
-the `gameDir`.
-
-TODO: The first arg `args[0]` is always expected to be `--server`. We could drop this completely.
--/
--- @[inherit_doc Lean.Server.FileWorker.workerMain]
-def workerMain (opts : Options) (args : List String): IO UInt32 := do
- let i ← IO.getStdin
- let o ← IO.getStdout
- let e ← IO.getStderr
- try
- let some gameDir := args[1]? | throwServerError "Expected second argument: gameDir"
- let exitCode ← initAndRunWorker i o e opts gameDir
- o.flush
- e.flush
- IO.Process.exit exitCode.toUInt8
- catch err =>
- e.putStrLn s!"worker initialization error: {err}"
- return (1 : UInt32)
-
-end GameServer.FileWorker
diff --git a/server/GameServer/Frontend.lean b/server/GameServer/Frontend.lean
new file mode 100644
index 00000000..e69de29b
diff --git a/server/GameServer/Graph.lean b/server/GameServer/Graph.lean
deleted file mode 100644
index 30adc160..00000000
--- a/server/GameServer/Graph.lean
+++ /dev/null
@@ -1,42 +0,0 @@
-import Lean
-
-open Lean Meta
-
-/-! ## Graph -/
-
-variable [inst : BEq α] [inst : Hashable α]
-
-structure Graph (α β : Type) [inst : BEq α] [inst : Hashable α] where
- nodes: HashMap α β := {}
- edges: Array (α × α) := {}
-deriving Inhabited
-
-instance [ToJson β] : ToJson (Graph Name β) := {
- toJson := fun graph => Json.mkObj [
- ("nodes", Json.mkObj (graph.nodes.toList.map fun (a,b) => (a.toString, toJson b))),
- ("edges", toJson graph.edges)
- ]
-}
-
--- Just a dummy implementation for now:
-instance : FromJson (Graph Name β) := {
- fromJson? := fun _ => .ok {
- nodes := {}
- edges := {}
- }
-}
-
-instance : EmptyCollection (Graph α β) := ⟨default⟩
-
-def Graph.insertNode (g : Graph α β) (a : α) (b : β) :=
- {g with nodes := g.nodes.insert a b}
-
-partial def Graph.predecessors (g : Graph α β) (x : α) (acc : HashSet α := {}) : HashSet α := Id.run do
- let mut res := acc
- let directPredecessors := (g.edges.filter (·.2 == x)).map (·.1)
- for y in directPredecessors do
- if ¬ res.contains y then
- res := res.insert y
- res := g.predecessors y res
-
- return res
diff --git a/server/GameServer/Helpers.lean b/server/GameServer/Helpers.lean
index dc6d953b..d8bc72b5 100644
--- a/server/GameServer/Helpers.lean
+++ b/server/GameServer/Helpers.lean
@@ -1,5 +1,6 @@
import Lean
-import GameServer.Helpers.PrettyPrinter
+import GameServer.Lean.PrettyPrinter
+import GameServer.Lean.DocComment
/-! This document contains various things which cluttered `Commands.lean`. -/
@@ -9,25 +10,6 @@ open Lean Meta Elab Command
namespace GameServer
-/-- Read a doc comment and get its content. Return `""` if no doc comment available. -/
-def parseDocComment! (doc: Option (TSyntax `Lean.Parser.Command.docComment)) :
- CommandElabM String := do
- match doc with
- | none =>
- logWarning "Add a text to this command with `/-- yada yada -/ MyCommand`!"
- pure ""
- | some s => match s.raw[1] with
- | .atom _ val => pure <| val.dropRight 2 |>.trim -- some (val.extract 0 (val.endPos - ⟨2⟩))
- | _ => pure "" --panic "not implemented error message" --throwErrorAt s "unexpected doc string{indentD s.raw[1]}"
-
-/-- Read a doc comment and get its content. Return `none` if no doc comment available. -/
-def parseDocComment (doc: Option (TSyntax `Lean.Parser.Command.docComment)) :
- CommandElabM <| Option String := do
- match doc with
- | none => pure none
- | some _ => parseDocComment! doc
-
-
/-- TODO: This is only used to provide some backwards compatibility and you can
replace `parseDocCommentLegacy` with `parseDocComment` in the future. -/
def parseDocCommentLegacy (doc: Option (TSyntax `Lean.Parser.Command.docComment))
@@ -71,22 +53,22 @@ syntax statementAttr := "(" &"attr" ":=" Parser.Term.attrInstance,* ")"
TODO: Why are we not using graphs here but our own construct `HashMap Name (HashSet Name)`?
-/
-partial def removeTransitiveAux (id : Name) (arrows : HashMap Name (HashSet Name))
- (newArrows : HashMap Name (HashSet Name)) (decendants : HashMap Name (HashSet Name)) :
- HashMap Name (HashSet Name) × HashMap Name (HashSet Name) := Id.run do
- match (newArrows.find? id, decendants.find? id) with
+partial def removeTransitiveAux (id : Name) (arrows : Std.HashMap Name (Std.HashSet Name))
+ (newArrows : Std.HashMap Name (Std.HashSet Name)) (decendants : Std.HashMap Name (Std.HashSet Name)) :
+ Std.HashMap Name (Std.HashSet Name) × Std.HashMap Name (Std.HashSet Name) := Id.run do
+ match (newArrows.get? id, decendants.get? id) with
| (some _, some _) => return (newArrows, decendants)
| _ =>
let mut newArr := newArrows
let mut desc := decendants
desc := desc.insert id {} -- mark as worked in case of loops
newArr := newArr.insert id {} -- mark as worked in case of loops
- let children := arrows.findD id {}
+ let children := arrows.getD id {}
let mut trimmedChildren := children
let mut theseDescs := children
for child in children do
(newArr, desc) := removeTransitiveAux child arrows newArr desc
- let childDescs := desc.findD child {}
+ let childDescs := desc.getD child {}
theseDescs := theseDescs.insertMany childDescs
for d in childDescs do
trimmedChildren := trimmedChildren.erase d
@@ -95,12 +77,12 @@ partial def removeTransitiveAux (id : Name) (arrows : HashMap Name (HashSet Name
return (newArr, desc)
-def removeTransitive (arrows : HashMap Name (HashSet Name)) : CommandElabM (HashMap Name (HashSet Name)) := do
+def removeTransitive (arrows : Std.HashMap Name (Std.HashSet Name)) : CommandElabM (Std.HashMap Name (Std.HashSet Name)) := do
let mut newArr := {}
let mut desc := {}
for id in arrows.toArray.map Prod.fst do
(newArr, desc) := removeTransitiveAux id arrows newArr desc
- if (desc.findD id {}).contains id then
+ if (desc.getD id {}).contains id then
logError <| m!"Loop at {id}. " ++
m!"This should not happen and probably means that `findLoops` has a bug."
-- DEBUG:
@@ -115,16 +97,16 @@ def removeTransitive (arrows : HashMap Name (HashSet Name)) : CommandElabM (Hash
For performance reason it returns a HashSet of visited
nodes as well. This is filled with all nodes ever looked at as they cannot be
part of a loop anymore. -/
-partial def findLoopsAux (arrows : HashMap Name (HashSet Name)) (node : Name)
- (path : Array Name := #[]) (visited : HashSet Name := {}) :
- Array Name × HashSet Name := Id.run do
+partial def findLoopsAux (arrows : Std.HashMap Name (Std.HashSet Name)) (node : Name)
+ (path : Array Name := #[]) (visited : Std.HashSet Name := {}) :
+ Array Name × Std.HashSet Name := Id.run do
let mut visited := visited
- match path.getIdx? node with
+ match path.indexOf? node with
| some i =>
-- Found a loop: `node` is already the iᵗʰ element of the path
return (path.extract i path.size, visited.insert node)
| none =>
- for successor in arrows.findD node {} do
+ for successor in arrows.getD node {} do
-- If we already visited the successor, it cannot be part of a loop anymore
if visited.contains successor then
continue
@@ -139,8 +121,8 @@ partial def findLoopsAux (arrows : HashMap Name (HashSet Name)) (node : Name)
return (#[], visited.insert node)
/-- Find a loop in the graph and return it. Returns `[]` if there are no loops. -/
-partial def findLoops (arrows : HashMap Name (HashSet Name)) : List Name := Id.run do
- let mut visited : HashSet Name := {}
+partial def findLoops (arrows : Std.HashMap Name (Std.HashSet Name)) : List Name := Id.run do
+ let mut visited : Std.HashSet Name := {}
for node in arrows.toArray.map (·.1) do
-- Skip a node if it was already visited
if visited.contains node then
diff --git a/server/GameServer/Inventory.lean b/server/GameServer/Inventory.lean
index fe3b3bd8..0d5d6d41 100644
--- a/server/GameServer/Inventory.lean
+++ b/server/GameServer/Inventory.lean
@@ -1,5 +1,10 @@
import Lean
import GameServer.EnvExtensions
+import GameServer.Inventory.Basic
+import GameServer.Inventory.Extension
+import GameServer.Tactic
+
+namespace GameServer
open Lean Elab Command
@@ -59,7 +64,7 @@ def getDocstring (env : Environment) (name : Name) (type : InventoryType) :
match type with
-- for tactics it's a lookup following mathlib's `#help`. not guaranteed to be the correct one.
| .Tactic => getTacticDocstring env name
- | .Lemma => findDocString? env name
+ | .Theorem => findDocString? env name
-- TODO: for definitions not implemented yet, does it work?
| .Definition => findDocString? env name
@@ -93,20 +98,20 @@ def checkInventoryDoc (type : InventoryType) (ref : Ident) (name : Name := ref.g
| none =>
logWarningAt ref (m!"Missing {type} Documentation: {name}\nAdd `{type}Doc {name}` " ++
m!"somewhere above this statement.")
- pure "(missing)"
+ pure ""
-- We just add a dummy entry
modifyEnv (inventoryTemplateExt.addEntry · {
type := type
name := name
- category := if type == .Lemma then s!"{n.getPrefix}" else ""
+ category := if type == .Theorem then s!"{n.getPrefix}" else ""
content := docstring})
-- Add the default documentation
| some s =>
modifyEnv (inventoryTemplateExt.addEntry · {
type := type
name := name
- category := if type == .Lemma then s!"{n.getPrefix}" else ""
+ category := if type == .Theorem then s!"{n.getPrefix}" else ""
content := s })
logInfoAt ref (m!"Missing {type} Documentation: {name}, used default (e.g. provided " ++
m!"docstring) instead. If you want to write a different description, add " ++
@@ -116,7 +121,9 @@ partial def collectUsedInventory (stx : Syntax) (acc : UsedInventory := {}) : Co
match stx with
| .missing => return acc
| .node _info kind args =>
- if kind == `GameServer.Tactic.Hint || kind == `GameServer.Tactic.Branch then return acc
+ -- skip `Hint`
+ -- skip and `Branch` and its content
+ if kind == ``GameServer.Tactic.Hint || kind == ``GameServer.Tactic.Branch then return acc
return ← args.foldlM (fun acc arg => collectUsedInventory arg acc) acc
| .atom _info val =>
-- ignore syntax elements that do not start with a letter
@@ -124,7 +131,7 @@ partial def collectUsedInventory (stx : Syntax) (acc : UsedInventory := {}) : Co
let allowed := GameServer.ALLOWED_KEYWORDS
if 0 < val.length ∧ val.data[0]!.isAlpha ∧ not (allowed.contains val) then
let val := val.dropRightWhile (fun c => c == '!' || c == '?') -- treat `simp?` and `simp!` like `simp`
- return {acc with tactics := acc.tactics.insert val}
+ return {acc with tactics := acc.tactics.insert (.mkSimple val)}
else
return acc
| .ident _info _rawVal val _preresolved =>
@@ -133,20 +140,20 @@ partial def collectUsedInventory (stx : Syntax) (acc : UsedInventory := {}) : Co
catch | _ => pure [] -- catch "unknown constant" error
return ← ns.foldlM (fun acc n => do
if let some (.thmInfo ..) := (← getEnv).find? n then
- return {acc with lemmas := acc.lemmas.insertMany ns}
+ return {acc with theorems := acc.theorems.insertMany ns}
else
return {acc with definitions := acc.definitions.insertMany ns}
) acc
-- #check expandOptDocComment?
-def GameLevel.getInventory (level : GameLevel) : InventoryType → InventoryInfo
+def Level.getInventory (level : Level) : InventoryType → InventoryInfo
| .Tactic => level.tactics
| .Definition => level.definitions
-| .Lemma => level.lemmas
+| .Theorem => level.theorems
-def GameLevel.setComputedInventory (level : GameLevel) :
- InventoryType → Array InventoryTile → GameLevel
+def Level.setComputedInventory (level : Level) :
+ InventoryType → Array InventoryTile → Level
| .Tactic, v => {level with tactics := {level.tactics with tiles := v}}
| .Definition, v => {level with definitions := {level.definitions with tiles := v}}
-| .Lemma, v => {level with lemmas := {level.lemmas with tiles := v}}
+| .Theorem, v => {level with theorems := {level.theorems with tiles := v}}
diff --git a/server/GameServer/Inventory/Basic.lean b/server/GameServer/Inventory/Basic.lean
new file mode 100644
index 00000000..6266a245
--- /dev/null
+++ b/server/GameServer/Inventory/Basic.lean
@@ -0,0 +1,111 @@
+import Lean
+
+/-! ## Inventory (documentation)
+
+The inventory contains documentation that the user can access.
+There are three inventory types: Theorem, Tactic, Definition. They vary about in the information
+they carry.
+
+The commands `TheoremDoc`, `TacticDoc`, and `DefinitionDoc` add keys and templates to an
+env. extension called `InventoryTemplateExt`. Commands like `NewTheorem`, etc. as well as
+`Statement` check if there is a key registered in this extension and might add a default or
+print a warning if not.
+
+Then, `MakeGame` takes the templates from `InventoryTemplateExt` and creates the documentation entries
+that are sent to the client. This allows us to modify them like adding information from
+mathlib or from parsing the theorem in question.
+-/
+
+namespace GameServer
+
+open Lean
+
+/-- The game knows three different inventory types that contain slightly different information -/
+inductive InventoryType where
+ | Tactic
+ | Theorem
+ | Definition
+deriving ToJson, FromJson, Repr, BEq, Hashable, Inhabited
+
+instance : ToString InventoryType where
+ toString t := match t with
+ | .Tactic => "Tactic"
+ | .Theorem => "Theorem"
+ | .Definition => "Definition"
+
+/-- The keys/templates of the inventory items, stored in `InventoryTemplateExt`. -/
+structure InventoryTemplate where
+ /-- Theorem, Tactic, or Definition -/
+ type: InventoryType
+ /-- Depends on the type:
+ * Tactic: the tactic's name
+ * Theorem: fully qualified theorem name
+ * Definition: no restrictions (preferably the definitions fully qualified name)
+ -/
+ name: Name
+ /-- Only for Theorems. To sort them into tabs -/
+ category: String := default
+ /-- Free-text short name -/
+ displayName: String := name.toString
+ /-- Template documentation. Allows for special tags to insert mathlib info [TODO!] -/
+ content: String := ""
+ deriving ToJson, Repr, Inhabited
+
+/-- A full inventory item including the processing by `MakeGame`, which creates these
+from the `InventoryTemplate`s and modifies them. -/
+structure InventoryItem extends InventoryTemplate where
+ statement: String := ""
+ deriving ToJson, Repr, Inhabited
+
+/-- A reduced variant of `InventoryItem` which is used for the tiles in the doc -/
+structure InventoryTile where
+ /--
+ The name of the item. The restrictions are:
+
+ * for Tactics: The name of the tactic.
+ * for Theorems: *Fully qualified* theorem name.
+ * for Definitions: no restrictions.
+ -/
+ name : Name
+ /-- The display name shown in the inventory. This can be free-text. -/
+ displayName : String
+ /-- Category to group inventory items by (currently only used for theorems). -/
+ category : String
+ /-- The world which introduced this item. -/
+ world : Option Name := none
+ /-- The level which introduced this item. -/
+ level : Option Nat := none
+ /-- Set to `true` if there exists an exercise in the game proving this statement. -/
+ proven := false
+ /-- If `true` then the item only gets unlocked in a later level. -/
+ locked := true
+ /-- If `true` then the item is blocked for this level. -/
+ disabled := false
+ /-- To mark an item that has been added freshly in this level. -/
+ new := false
+ /-- hide the item in the inventory display -/
+ hidden := false
+ /-- hover text -/
+ altTitle : String := default
+deriving ToJson, FromJson, Repr, Inhabited, BEq
+
+def InventoryItem.toTile (item : InventoryItem) : InventoryTile := {
+ name := item.name,
+ displayName := item.displayName
+ category := item.category
+}
+
+structure InventoryInfo where
+ /-- inventory items used by the main sample solution of this level -/
+ used : Array Name
+ /-- new inventory items introduced by this level -/
+ new : Array Name
+ /-- inventory items that shall not be displayed in the inventory -/
+ hidden : Array Name
+ /-- inventory items exceptionally forbidden in this level -/
+ disabled : Array Name
+ /-- only these inventory items are allowed in this level (ignored if empty) -/
+ only : Array Name
+ /-- inventory items in this level (computed by `MakeGame`) -/
+ tiles : Array InventoryTile
+deriving ToJson, FromJson, Repr, Inhabited
diff --git a/server/GameServer/Inventory/Extension.lean b/server/GameServer/Inventory/Extension.lean
new file mode 100644
index 00000000..534c90c4
--- /dev/null
+++ b/server/GameServer/Inventory/Extension.lean
@@ -0,0 +1,35 @@
+import GameServer.Inventory.Basic
+
+/-!
+-/
+
+namespace GameServer
+
+open Lean
+
+/-- The extension that stores the doc templates. Note that you can only add, but never modify
+entries! -/
+initialize inventoryTemplateExt :
+ SimplePersistentEnvExtension InventoryTemplate (Array InventoryTemplate) ←
+ registerSimplePersistentEnvExtension {
+ name := `inventory_keys
+ addEntryFn := Array.push
+ addImportedFn := Array.flatMap id }
+
+/-- Receive the template with that matches `(name, type)` -/
+def getInventoryTemplate? [Monad m] [MonadEnv m] (n : Name) (type : InventoryType) :
+ m (Option InventoryTemplate) := do
+ return (inventoryTemplateExt.getState (← getEnv)).find? (fun x => x.name == n && x.type == type)
+
+/-- The extension that contains the inventory content after it has been processed.
+`MakeGame` is the only command adding items here. -/
+initialize inventoryExt : SimplePersistentEnvExtension InventoryItem (Array InventoryItem) ←
+ registerSimplePersistentEnvExtension {
+ name := `inventory_doc
+ addEntryFn := Array.push
+ addImportedFn := Array.flatMap id }
+
+/-- Receive the item with that matches `(name, type)` -/
+def getInventoryItem? [Monad m] [MonadEnv m] (n : Name) (type : InventoryType) :
+ m (Option InventoryItem) := do
+ return (inventoryExt.getState (← getEnv)).find? (fun x => x.name == n && x.type == type)
diff --git a/server/GameServer/Layer.lean b/server/GameServer/Layer.lean
new file mode 100644
index 00000000..e38b9b2f
--- /dev/null
+++ b/server/GameServer/Layer.lean
@@ -0,0 +1,25 @@
+import GameServer.Layer.Current
+import GameServer.Layer.Defs
+import GameServer.Layer.Extension
+import GameServer.Layer.Game
+import GameServer.Layer.Level
+import GameServer.Layer.World
+
+/-!
+# Layers
+
+A game consisists of multiple layers:
+
+First, there is the `Game` itself. Each `Game` has mulitple `World`s and a `World`
+contains multiple `Level`s.
+
+The levels inside a world are ordered and indexed by natural numbers `1, 2, 3, …`. Level `0` is
+reserved to display the world's "introduction text".
+
+Worlds are indexed by there name. A game containes a directed graph which describes
+the order of the worlds among each other.
+
+# Important definitions
+
+- `LevelId`: refers to a combination "game name, world name, level index"
+-/
diff --git a/server/GameServer/Layer/Current.lean b/server/GameServer/Layer/Current.lean
new file mode 100644
index 00000000..80352da0
--- /dev/null
+++ b/server/GameServer/Layer/Current.lean
@@ -0,0 +1,61 @@
+import Lean
+import GameServer.Layer.Defs
+
+namespace GameServer
+
+open Lean
+
+/-!
+## Environment extensions for game specification
+-/
+
+variable {m: Type → Type} [Monad m] [MonadEnv m]
+
+/-- Register a (non-persistent) environment extension to hold the current game -/
+initialize curGameExt : EnvExtension (Option Name) ← registerEnvExtension (pure none)
+
+/-- Register a (non-persistent) environment extension to hold the current world -/
+initialize curWorldExt : EnvExtension (Option Name) ← registerEnvExtension (pure none)
+
+/-- Register a (non-persistent) environment extension to hold the current level -/
+initialize curLevelExt : EnvExtension (Option Nat) ← registerEnvExtension (pure none)
+
+/-- Set the current game -/
+def setCurGameId (game : Name) : m Unit :=
+ modifyEnv (curGameExt.setState · game)
+
+/-- Set the current world -/
+def setCurWorldId (world : Name) : m Unit :=
+ modifyEnv (curWorldExt.setState · world)
+
+/-- Set the current level -/
+def setCurLevelIdx (level : Nat) : m Unit :=
+ modifyEnv (curLevelExt.setState · level)
+
+/-- Get the current layer. -/
+def getCurLayer [MonadError m] : m Layer := do
+ -- previously, we also had `curGameExt.getState (← getEnv), ` in here, which got removed
+ -- when we made the `Game` command optional
+ match curWorldExt.getState (← getEnv), curLevelExt.getState (← getEnv) with
+ | some _, some _ => return Layer.Level
+ | some _, none => return Layer.World
+ | none, none => return Layer.Game
+ | _, _ => throwError "Invalid Layer"
+
+/-- Get the current game, or default if none is specified -/
+def getCurGameId [Monad m] : m Name := do
+ match curGameExt.getState (← getEnv) with
+ | some game => return game
+ | none => return .mkSimple defaultGameName
+
+/-- Get the current world -/
+def getCurWorldId [MonadError m] : m Name := do
+ match curWorldExt.getState (← getEnv) with
+ | some world => return world
+ | none => throwError "Current world not set"
+
+/-- Get the current level -/
+def getCurLevelIdx [MonadError m] : m Nat := do
+ match curLevelExt.getState (← getEnv) with
+ | some level => return level
+ | none => throwError "Current level not set"
diff --git a/server/GameServer/Layer/Defs.lean b/server/GameServer/Layer/Defs.lean
new file mode 100644
index 00000000..fdd8e1d6
--- /dev/null
+++ b/server/GameServer/Layer/Defs.lean
@@ -0,0 +1,17 @@
+
+namespace GameServer
+
+open Lean
+
+/--
+A game has three layers: Game, World, Levels. These are set with the commands
+`Game`, `World`, and `Level`. Commands like `Introduction` depend on the current level.
+-/
+inductive Layer where
+ | Game
+ | World
+ | Level
+
+/-- The default game name if `Game "MyGame"` is not used. -/
+def defaultGameName: String := "MyGame"
+-- Note: When changing any of these default names, one also needs to change them in `index.mjs`
diff --git a/server/GameServer/Layer/Extension.lean b/server/GameServer/Layer/Extension.lean
new file mode 100644
index 00000000..3f853893
--- /dev/null
+++ b/server/GameServer/Layer/Extension.lean
@@ -0,0 +1,99 @@
+import GameServer.Layer.Game
+
+/-! ## Game environment extension -/
+
+namespace GameServer
+
+open Lean
+
+initialize gameExt : PersistentEnvExtension (Name × Game) (Name × Game) (Std.HashMap Name Game) ←
+ do registerPersistentEnvExtension {
+ name := `gameExt,
+ mkInitial := pure {},
+ addImportedFn := fun ess => do
+ let mut games := {}
+ for es in ess do
+ for (name, game) in es do
+ match games.get? name with
+ | some oldgame =>
+ games := games.insert name (Game.merge oldgame game)
+ | none =>
+ games := games.insert name game
+ return games
+ addEntryFn := (λ s n => s.insert n.1 n.2),
+ exportEntriesFn := Std.HashMap.toArray,
+ statsFn := fun s => format "number of local entries: " ++ format s.size
+}
+
+variable {m: Type → Type} [Monad m] [MonadEnv m]
+
+def getGame? (n : Name) : m (Option Game) := do
+ return (gameExt.getState (← getEnv)).get? n
+
+def insertGame (n : Name) (g : Game) : m Unit := do
+ modifyEnv (gameExt.addEntry · (n, g))
+
+def getLevel? (levelId : LevelId) : m (Option GameServer.Level) := do
+ let some game ← getGame? levelId.game
+ | return none
+ let some world := game.worlds.nodes.get? levelId.world
+ | return none
+ let some level := world.levels.get? levelId.level
+ | return none
+ return level
+
+def getCurGame [Monad m] : m Game := do
+ let some game ← getGame? (← getCurGameId)
+ | let game := {name := .mkSimple defaultGameName}
+ insertGame (.mkSimple defaultGameName) game
+ return game
+ return game
+
+def modifyCurGame (fn : Game → m Game) [MonadError m] : m Unit := do
+ let game ← getCurGame
+ insertGame game.name (← fn game)
+
+def addWorld (world : World) [MonadError m] : m Unit := do
+ modifyCurGame fun game => do
+ return {game with worlds := game.worlds.insertNode world.name world}
+
+def getCurWorld [MonadError m] : m World := do
+ let some world := (← getCurGame).worlds.nodes.get? (← getCurWorldId)
+ | throwError m!"World {← getCurWorldId} does not exist"
+ return world
+
+def modifyCurWorld (fn : World → m World) [MonadError m] : m Unit := do
+ modifyCurGame fun game => do
+ let world ← getCurWorld
+ return {game with worlds := {game.worlds with nodes := game.worlds.nodes.insert world.name (← fn world) }}
+
+def addLevel (level : GameServer.Level) [MonadError m] : m Unit := do
+ let worldId ← getCurWorldId
+ match ← getLevel? ⟨← getCurGameId, worldId, level.index⟩ with
+ | some _existingLevel =>
+ throwError m!"Level {level.index} already exists for world {worldId}!"
+ | none =>
+ modifyCurWorld fun world => do
+ return {world with levels := world.levels.insert level.index level}
+
+def getCurLevel [MonadError m] : m GameServer.Level := do
+ let some level := (← getCurWorld).levels.get? (← getCurLevelIdx)
+ | throwError m!"Level {← getCurLevelIdx} does not exist"
+ return level
+
+def modifyCurLevel (fn : GameServer.Level → m GameServer.Level) [MonadError m] : m Unit := do
+ modifyCurWorld fun world => do
+ let level ← getCurLevel
+ return {world with levels := world.levels.insert level.index (← fn level)}
+
+def modifyLevel (levelId : LevelId) (fn : GameServer.Level → m GameServer.Level) [MonadError m] : m Unit := do
+ let some game ← getGame? levelId.game
+ | throwError m!"Game {levelId.game} does not exist"
+ let some world := (← getCurGame).worlds.nodes.get? levelId.world
+ | throwError m!"World {levelId.world} does not exist"
+ let some level := world.levels.get? levelId.level
+ | throwError m!"Level {levelId.level} does not exist"
+ let level' ← fn level
+ let world' := {world with levels := world.levels.insert levelId.level level'}
+ let game' := {game with worlds := game.worlds.insertNode levelId.world world'}
+ insertGame levelId.game game'
diff --git a/server/GameServer/Layer/Game.lean b/server/GameServer/Layer/Game.lean
new file mode 100644
index 00000000..a77e9260
--- /dev/null
+++ b/server/GameServer/Layer/Game.lean
@@ -0,0 +1,74 @@
+import GameServer.Layer.World
+import GameServer.Util.Graph
+
+/-! ## Game -/
+
+namespace GameServer
+
+open Lean
+
+/-- A tile as they are displayed on the servers landing page. -/
+structure GameTile where
+ /-- The title of the game -/
+ title: String
+ /-- One catch phrase about the game -/
+ short: String := default
+ /-- One paragraph description what the game is about -/
+ long: String := default
+ /-- List of languages the game supports
+
+ TODO: What's the expectected format
+ TODO: Must be a list with a single language currently
+ -/
+ languages: List String := default
+ /-- A list of games which this one builds upon -/
+ prerequisites: List String := default
+ /-- Number of worlds in the game -/
+ worlds: Nat := default
+ /-- Number of levels in the game -/
+ levels: Nat := default
+ /-- A cover image of the game
+
+ TODO: What's the format? -/
+ image: String := default
+deriving Inhabited, ToJson, FromJson
+
+structure Game where
+ /-- Internal name of the game. -/
+ name : Name
+ /-- TODO: currently unused. -/
+ title : String := default
+ /-- Text displayed on the main landing page of the game. -/
+ introduction : String := default
+ /-- Text displayed on the main landing page of the game. -/
+ info : String := default
+ /-- TODO: currently unused. -/
+ conclusion : String := default
+ /-- TODO: currently unused. -/
+ authors : List String := default
+ worlds : Graph Name World := default
+ /-- The tile displayed on the server's landing page. -/
+ tile : GameTile := default
+ /-- The path to the background image of the world. -/
+ image : String := default
+deriving Inhabited, ToJson, FromJson
+
+-- TODO: rename to `Game.toJson`
+def getGameJson (game : Game) : Json := Id.run do
+ let gameJson : Json := toJson game
+ -- Add world sizes to Json object
+ let worldSize := game.worlds.nodes.toList.map (fun (n, w) => (n.toString, w.levels.size))
+ let gameJson := gameJson.mergeObj (Json.mkObj [("worldSize", Json.mkObj worldSize)])
+ return gameJson
+
+def Game.merge (old : Game) (new : Game) : Game :=
+{ new with
+ worlds := {
+ nodes := old.worlds.nodes.merge new.worlds.nodes World.merge
+ edges := Id.run do
+ let mut res := old.worlds.edges
+ for e in new.worlds.edges do
+ if ¬ res.contains e then
+ res := res.insert e
+ return res
+ } }
diff --git a/server/GameServer/Layer/Level.lean b/server/GameServer/Layer/Level.lean
new file mode 100644
index 00000000..5edb8c9a
--- /dev/null
+++ b/server/GameServer/Layer/Level.lean
@@ -0,0 +1,121 @@
+import Lean
+import GameServer.Layer.Current
+import GameServer.Inventory.Extension
+import GameServer.Tactic.Hint.Defs
+
+/-! ## Levels -/
+
+namespace GameServer
+
+open Lean
+
+structure LevelId where
+ game : Name
+ world : Name
+ level : Nat
+deriving Inhabited
+
+instance : ToString LevelId := ⟨fun id =>
+ s!"{id.game}:{id.world}:{id.level}"⟩
+
+variable {m: Type → Type} [Monad m] [MonadEnv m]
+
+def getCurLevelId [MonadError m] : m LevelId := do
+ return { game := ← getCurGameId, world := ← getCurWorldId, level := ← getCurLevelIdx}
+
+/-- Instance to make GameServer.Level Repr work -/
+instance : Repr Elab.Command.Scope := ⟨fun s _ => repr s.currNamespace⟩
+
+structure Level where
+ index: Nat
+ /-- The title of the level. -/
+ title: String := ""
+ /-- Introduction text shown all the time. (markdown) -/
+ introduction: String := ""
+ conclusion: String := ""
+ /-- The name of the exercise proven. If provided this theorem will be available in
+ future levels. -/
+ statementName: Name := default
+ hints: Array GoalHintEntry := default
+ /-- The statement in Lean. -/
+ goal : TSyntax `Lean.Parser.Command.declSig := default
+ scope : Elab.Command.Scope := default
+ /-- The mathematical statement in mathematician-readable form. (markdown) -/
+ descrText: Option String := none
+ descrFormat : String := default
+ /-- The `category` of theorems to be open by default -/
+ theoremTab: Option String := none
+ /-- The module to be imported when playing this level -/
+ module : Name := default
+ tactics: InventoryInfo := default
+ definitions: InventoryInfo := default
+ theorems: InventoryInfo := default
+ /-- A proof template that is printed in an empty editor. -/
+ template: Option String := none
+ /-- The image for this level. -/
+ image : String := default
+ /-- A sequence of tactics the game automatically executes before the first step. -/
+ preamble : TSyntax `Lean.Parser.Tactic.tacticSeq := default
+deriving Inhabited, Repr
+
+/--
+Merge two levels.
+
+Currently overwrites old one with the new one
+-/
+def Level.merge (_old : GameServer.Level) (new : GameServer.Level) : GameServer.Level :=
+ new
+
+/-- Json-encodable version of `GameServer.Level`
+Fields:
+- description: Theorem in mathematical language.
+- descriptionGoal: Theorem printed as Lean-Code.
+-/
+structure LevelInfo where
+ index : Nat
+ title : String
+ tactics : Array InventoryTile
+ theorems : Array InventoryTile
+ definitions : Array InventoryTile
+ introduction : String
+ conclusion : String
+ descrText : Option String := none
+ descrFormat : String := ""
+ theoremTab : Option String
+ module : Name
+ displayName : Option String
+ statementName : Option String
+ template : Option String
+ image: Option String
+deriving ToJson, FromJson
+
+def Level.toInfo (lvl : GameServer.Level) (env : Environment) : LevelInfo :=
+ { index := lvl.index,
+ title := lvl.title,
+ tactics := lvl.tactics.tiles,
+ theorems := lvl.theorems.tiles,
+ definitions := lvl.definitions.tiles,
+ descrText := lvl.descrText,
+ descrFormat := lvl.descrFormat --toExpr <| format (lvl.goal.raw) --toString <| Syntax.formatStx (lvl.goal.raw) --Syntax.formatStx (lvl.goal.raw) , -- TODO
+ introduction := lvl.introduction
+ conclusion := lvl.conclusion
+ theoremTab := match lvl.theoremTab with
+ | some tab => tab
+ | none =>
+ -- Try to set the theorem tab to the category of the first added theorem
+ match lvl.theorems.tiles.find? (·.new) with
+ | some tile => tile.category
+ | none => none
+ statementName := lvl.statementName.toString
+ module := lvl.module
+ displayName := match lvl.statementName with
+ | .anonymous => none
+ | name => match (inventoryExt.getState env).find?
+ (fun x => x.name == name && x.type == .Theorem) with
+ | some n => n.displayName
+ | none => name.toString
+ -- Note: we could call `.find!` because we check in `Statement` that the
+ -- theorem doc must exist.
+ template := lvl.template
+ image := lvl.image
+ }
diff --git a/server/GameServer/Layer/World.lean b/server/GameServer/Layer/World.lean
new file mode 100644
index 00000000..f51b041e
--- /dev/null
+++ b/server/GameServer/Layer/World.lean
@@ -0,0 +1,36 @@
+import GameServer.Layer.Level
+import GameServer.Lean.HashMap
+
+/-! ## World -/
+
+namespace GameServer
+
+open Lean
+
+/-- A world is a collection of levels, like a chapter. -/
+structure World where
+ /- Internal name of the world. Not visible to the player. -/
+ name: Name
+ /-- Display title of the world. -/
+ title: String := default
+ /-- World introduction to be shown before the first level is loaded. (markdown) -/
+ introduction: String := default
+ /-- TODO: This is currently unused. -/
+ conclusion : String := default
+ /-- The levels of the world. -/
+ levels: Std.HashMap Nat GameServer.Level := default
+ /-- The introduction image of the world. -/
+ image: String := default
+deriving Inhabited
+
+instance : ToJson World := ⟨
+ fun world => Json.mkObj [
+ ("name", toJson world.name),
+ ("title", world.title),
+ ("introduction", world.introduction),
+ ("image", world.image)]
+⟩
+
+def World.merge (old : World) (new : World) : World :=
+ { new with
+ levels := old.levels.merge new.levels GameServer.Level.merge}
diff --git a/server/GameServer/Lean/DocComment.lean b/server/GameServer/Lean/DocComment.lean
new file mode 100644
index 00000000..39162b15
--- /dev/null
+++ b/server/GameServer/Lean/DocComment.lean
@@ -0,0 +1,27 @@
+import Lean
+
+/-!
+# Parse doc comments
+-/
+
+open Lean Meta Elab Command
+
+namespace GameServer
+
+/-- Read a doc comment and get its content. Return `""` if no doc comment available. -/
+def parseDocComment! (doc: Option (TSyntax `Lean.Parser.Command.docComment)) :
+ CommandElabM String := do
+ match doc with
+ | none =>
+ logWarning "Add a text to this command with `/-- yada yada -/ MyCommand`!"
+ pure ""
+ | some s => match s.raw[1] with
+ | .atom _ val => pure <| val.dropRight 2 |>.trim
+ | _ => pure ""
+
+/-- Read a doc comment and get its content. Return `none` if no doc comment available. -/
+def parseDocComment (doc: Option (TSyntax `Lean.Parser.Command.docComment)) :
+ CommandElabM <| Option String := do
+ match doc with
+ | none => pure none
+ | some _ => parseDocComment! doc
diff --git a/server/GameServer/Lean/HashMap.lean b/server/GameServer/Lean/HashMap.lean
new file mode 100644
index 00000000..2d1ab8e1
--- /dev/null
+++ b/server/GameServer/Lean/HashMap.lean
@@ -0,0 +1,8 @@
+import Lean
+
+def Std.HashMap.merge [BEq α] [Hashable α] (old : Std.HashMap α β) (new : Std.HashMap α β)
+ (merge : β → β → β) : Std.HashMap α β :=
+new.fold (fun acc a b =>
+ if let some bOld := acc.get? a
+ then acc.insert a (merge bOld b)
+ else acc.insert a b) old
diff --git a/server/GameServer/Helpers/PrettyPrinter.lean b/server/GameServer/Lean/PrettyPrinter.lean
similarity index 71%
rename from server/GameServer/Helpers/PrettyPrinter.lean
rename to server/GameServer/Lean/PrettyPrinter.lean
index 81095653..f5855ffd 100644
--- a/server/GameServer/Helpers/PrettyPrinter.lean
+++ b/server/GameServer/Lean/PrettyPrinter.lean
@@ -3,24 +3,14 @@ import Lean.PrettyPrinter.Delaborator.Builtins
import Lean.PrettyPrinter
import Lean
-import Std.Tactic.OpenPrivate
+import Batteries.Tactic.OpenPrivate
-namespace GameServer
+namespace GameServer.PrettyPrinter
-namespace PrettyPrinter
-
-open Lean Meta
-open Lean.Parser Term
-open PrettyPrinter Delaborator SubExpr
-open TSyntax.Compat
-
-open private shouldGroupWithNext evalSyntaxConstant from Lean.PrettyPrinter.Delaborator.Builtins
-
--- def typeSpec := leading_parser " :\\n: " >> termParser
-
--- def declSig := leading_parser
--- many (ppSpace >> (Term.binderIdent <|> Term.bracketedBinder)) >> typeSpec
+open Lean PrettyPrinter
+open Meta Lean.Parser Term Delaborator SubExpr TSyntax.Compat in
+open private shouldGroupWithNext evalSyntaxConstant from Lean.PrettyPrinter.Delaborator.Builtins in
@[inherit_doc Lean.PrettyPrinter.Delaborator.delabConstWithSignature]
partial def delabConstWithSignature : Delab := do
@@ -57,11 +47,13 @@ where
withBindingBody n <| delabParams idStx (groups.push group) #[]
else
let type ← delab
-
-- pure type
`(Command.declSig| $groups* : $type)
-@[inherit_doc Lean.PrettyPrinter.ppSignature]
+/--
+Like `Lean.PrettyPrinter.ppSignature` but with a custom delaboration `delabConstWithSignature`
+-/
+-- @[inherit_doc Lean.PrettyPrinter.ppSignature]
def ppSignature (c : Name) : MetaM FormatWithInfos := do
let decl ← getConstInfo c
let e := .const c (decl.levelParams.map mkLevelParam)
@@ -74,20 +66,21 @@ open Lean Meta Elab Command
/-! ## Statement string -/
-def getStatement (name : Name) : CommandElabM MessageData := do
- return ← addMessageContextPartial (.ofPPFormat { pp := fun
- | some ctx => ctx.runMetaM <| GameServer.PrettyPrinter.ppSignature name
- | none => return "that's a bug." })
+@[inherit_doc Lean.MessageData.signature]
+def MessageData.signature (c : Name) : CommandElabM MessageData := do
+ return .ofFormatWithInfosM (PrettyPrinter.ppSignature c)
--- Note: We use `String` because we can't send `MessageData` as json, but
--- `MessageData` might be better for interactive highlighting.
-/-- Get a string of the form `my_lemma (n : ℕ) : n + n = 2 * n`.
+/--
+Get a string of the form `my_lemma (n : ℕ) : n + n = 2 * n`.
Note: A statement like `theorem abc : ∀ x : Nat, x ≥ 0` would be turned into
-`theorem abc (x : Nat) : x ≥ 0` by `PrettyPrinter.ppSignature`. -/
+`theorem abc (x : Nat) : x ≥ 0` by `GameServer.PrettyPrinter.ppSignature`.
+
+Note: We use `String` because we can't send `MessageData` as json, but
+`MessageData` might be better for interactive highlighting.
+-/
def getStatementString (name : Name) : CommandElabM String := do
- --try
- return ← (← getStatement name).toString
- --catch
- --| _ => throwError m!"Could not find {name} in context."
+ (← MessageData.signature name).toString
-- TODO: I think it would be nicer to unresolve Namespaces as much as possible.
+
+end GameServer
diff --git a/server/GameServer/Lean/String.lean b/server/GameServer/Lean/String.lean
new file mode 100644
index 00000000..4f8c2b0f
--- /dev/null
+++ b/server/GameServer/Lean/String.lean
@@ -0,0 +1,16 @@
+namespace String
+
+/-- Remove any spaces at the beginning of a new line -/
+partial def removeIndentation (s : String) : String :=
+ let rec loop (i : String.Pos) (acc : String) (removeSpaces := false) : String :=
+ let c := s.get i
+ let i := s.next i
+ if s.atEnd i then
+ acc.push c
+ else if removeSpaces && c == ' ' then
+ loop i acc (removeSpaces := true)
+ else if c == '\n' then
+ loop i (acc.push c) (removeSpaces := true)
+ else
+ loop i (acc.push c)
+ loop ⟨0⟩ ""
diff --git a/server/GameServer/RpcHandlers.lean b/server/GameServer/RpcHandlers.lean
deleted file mode 100644
index ce4e61ca..00000000
--- a/server/GameServer/RpcHandlers.lean
+++ /dev/null
@@ -1,379 +0,0 @@
-import GameServer.EnvExtensions
-import GameServer.InteractiveGoal
-import GameServer.Hints
-import I18n
-
-open Lean
-open Server
-open Widget
-open RequestM
-open Meta
-
-/-! ## GameGoal -/
-
-namespace GameServer
-
-def levelIdFromFileName? (initParams : Lsp.InitializeParams) (fileName : String) : Option LevelId := Id.run do
- let fileParts := fileName.splitOn "/"
- if fileParts.length == 3 then
- if let (some level, some game) := (fileParts[2]!.toNat?, initParams.rootUri?) then
- return some {game, world := fileParts[1]!, level := level}
- return none
-
-def getLevelByFileName? [Monad m] [MonadEnv m] (initParams : Lsp.InitializeParams) (fileName : String) : m (Option GameLevel) := do
- let some levelId := levelIdFromFileName? initParams fileName
- | return none
- return ← getLevel? levelId
-
-structure FVarBijection :=
- (forward : HashMap FVarId FVarId)
- (backward : HashMap FVarId FVarId)
-
-instance : EmptyCollection FVarBijection := ⟨{},{}⟩
-
-def FVarBijection.insert (bij : FVarBijection) (a b : FVarId) : FVarBijection :=
- ⟨bij.forward.insert a b, bij.backward.insert b a⟩
-
-def FVarBijection.insert? (bij : FVarBijection) (a b : FVarId) : Option FVarBijection :=
- let a' := bij.forward.find? a
- let b' := bij.forward.find? b
- if (a' == none || a' == some b) && (b' == none || b' == some a)
- then some $ bij.insert a b
- else none
-
-/-- Checks if `pattern` and `e` are equal up to FVar identities. -/
-partial def matchExpr (pattern : Expr) (e : Expr) (bij : FVarBijection := {}) : Option FVarBijection :=
- match pattern, e with
- | .bvar i1, .bvar i2 => if i1 == i2 then bij else none
- | .fvar i1, .fvar i2 => bij.insert? i1 i2
- | .mvar _, .mvar _ => bij
- | .sort _u1, .sort _u2 => bij -- TODO?
- | .const n1 _ls1, .const n2 _ls2 =>
- if n1 == n2 then bij else none -- && (← (ls1.zip ls2).allM fun (l1, l2) => Meta.isLevelDefEq l1 l2)
- | .app f1 a1, .app f2 a2 =>
- some bij
- |> (Option.bind · (fun bij => matchExpr f1 f2 bij))
- |> (Option.bind · (fun bij => matchExpr a1 a2 bij))
- | .lam _ t1 b1 _, .lam _ t2 b2 _ =>
- some bij
- |> (Option.bind · (fun bij => matchExpr t1 t2 bij))
- |> (Option.bind · (fun bij => matchExpr b1 b2 bij))
- | .forallE _ t1 b1 _, .forallE _ t2 b2 _ =>
- some bij
- |> (Option.bind · (fun bij => matchExpr t1 t2 bij))
- |> (Option.bind · (fun bij => matchExpr b1 b2 bij))
- | .letE _ t1 v1 b1 _, .letE _ t2 v2 b2 _ =>
- some bij
- |> (Option.bind · (fun bij => matchExpr t1 t2 bij))
- |> (Option.bind · (fun bij => matchExpr v1 v2 bij))
- |> (Option.bind · (fun bij => matchExpr b1 b2 bij))
- | .lit l1, .lit l2 =>
- if l1 == l2 then bij else none
- | .proj i1 n1 e1, .proj i2 n2 e2 =>
- if i1 == i2 && n1 == n2 then matchExpr e1 e2 bij else none
- -- ignore mdata:
- | .mdata _ pattern', _ =>
- matchExpr pattern' e bij
- | _, .mdata _ e' =>
- matchExpr pattern e' bij
- | _, _ => none
-
-/-- Check if each fvar in `patterns` has a matching fvar in `fvars` -/
-def matchDecls (patterns : Array Expr) (fvars : Array Expr) (strict := true) (initBij : FVarBijection := {}) : MetaM (Option FVarBijection) := do
- -- We iterate through the array backwards hoping that this will find us faster results
- -- TODO: implement backtracking
- let mut bij := initBij
- for i in [:patterns.size] do
- let pattern := patterns[patterns.size - i - 1]!
- if bij.forward.contains pattern.fvarId! then
- continue
- for j in [:fvars.size] do
- let fvar := fvars[fvars.size - j - 1]!
- if bij.backward.contains fvar.fvarId! then
- continue
-
- if let some bij' := matchExpr
- (← instantiateMVars $ ← inferType pattern)
- (← instantiateMVars $ ← inferType fvar) bij then
- -- usedFvars := usedFvars.set! (fvars.size - j - 1) true
- bij := bij'.insert pattern.fvarId! fvar.fvarId!
- break
- if ! bij.forward.contains pattern.fvarId! then return none
-
- if !strict || fvars.all (fun fvar => bij.backward.contains fvar.fvarId!)
- then return some bij
- else return none
-
-open Meta in
-/-- Find all hints whose trigger matches the current goal -/
-def findHints (goal : MVarId) (m : DocumentMeta) (initParams : Lsp.InitializeParams) : MetaM (Array GameHint) := do
- goal.withContext do
- let some level ← getLevelByFileName? initParams m.mkInputContext.fileName
- | throwError "Level not found: {m.mkInputContext.fileName}"
- let hints ← level.hints.filterMapM fun hint => do
- openAbstractCtxResult hint.goal fun hintFVars hintGoal => do
- if let some fvarBij := matchExpr (← instantiateMVars $ hintGoal) (← instantiateMVars $ ← inferType $ mkMVar goal)
- then
-
- -- NOTE: This code for `hintFVarsNames` is also duplicated in the
- -- "Statement" command, where `hint.rawText` is created. They need to be matching.
- -- NOTE: This is a bit a hack of somebody who does not know how meta-programming works.
- -- All we want here is a list of `userNames` for the `FVarId`s in `hintFVars`...
- -- and we wrap them in `«{}»` here since I don't know how to do it later.
- let mut hintFVarsNames : Array Expr := #[]
- for fvar in hintFVars do
- let name₁ ← fvar.fvarId!.getUserName
- hintFVarsNames := hintFVarsNames.push <| Expr.fvar ⟨s!"«\{{name₁}}»"⟩
-
- let lctx := (← goal.getDecl).lctx -- the player's local context
- if let some bij ← matchDecls hintFVars lctx.getFVars
- (strict := hint.strict) (initBij := fvarBij)
- then
- let userFVars := hintFVars.map fun v => bij.forward.findD v.fvarId! v.fvarId!
- -- Evaluate the text in the player's context to get the new variable names.
- let text := (← evalHintMessage hint.text) (userFVars.map Expr.fvar)
- let ctx := {env := ← getEnv, mctx := ← getMCtx, lctx := lctx, opts := {}}
- let text ← (MessageData.withContext ctx text).toString
-
- -- Here we map the goal's variable names to the player's variable names.
- let mut varNames : Array <| Name × Name := #[]
- for (fvar₁, fvar₂) in bij.forward.toArray do
- -- get the `userName` of the fvar in the opened local context of the hint.
- let name₁ ← fvar₁.getUserName
- -- get the `userName` in the player's local context.
- let name₂ := (lctx.get! fvar₂).userName
- varNames := varNames.push (name₁, name₂)
-
- return some {
- text := text,
- hidden := hint.hidden,
- rawText := hint.rawText,
- varNames := varNames }
-
- else return none
- else
- return none
- return hints
-
-def filterUnsolvedGoal (a : Array InteractiveDiagnostic) :
- Array InteractiveDiagnostic :=
- a.filter (fun d => match d.message with
- | .append ⟨(.text x) :: _⟩ => x != "unsolved goals"
- | _ => true)
-
--- TODO: no need to have `RequestM`, just anything where `mut` works
-/-- Add custom diagnostics about whether the level is completed. -/
-def completionDiagnostics (goalCount : Nat) (prevGoalCount : Nat) (completed : Bool)
- (completedWithWarnings : Bool) (pos : Lsp.Position)
- (startDiags : Array InteractiveDiagnostic := #[]) :
- RequestM <| Array InteractiveDiagnostic := do
- let mut out : Array InteractiveDiagnostic := startDiags
- if goalCount == 0 then
- if completed then
- out := out.push {
- -- TODO: marking these with `t!` has the implication that every game
- -- needs to translate these messages again,
- -- but cannot think of another option
- -- that would not involve manually adding them somewhere in the translation files.
- message := .text t!"level completed! 🎉"
- range := {
- start := pos
- «end» := pos
- }
- severity? := Lsp.DiagnosticSeverity.information }
- else if completedWithWarnings then
- out := out.push {
- message := .text t!"level completed with warnings… 🎭"
- range := {
- start := pos
- «end» := pos
- }
- severity? := Lsp.DiagnosticSeverity.information }
- else
- pure ()
- else if goalCount < prevGoalCount then
- -- If there is any errors, goals might vanish without being 'solved'
- -- so showing the message "intermediate goal solved" would be confusing.
- if (¬ (filterUnsolvedGoal startDiags).any (·.severity? == some .error)) then
- out := out.push {
- message := .text t!"intermediate goal solved! 🎉"
- range := {
- start := pos
- «end» := pos
- }
- severity? := Lsp.DiagnosticSeverity.information
- }
-
- return out
-
-
-/-- Request that returns the goals at the end of each line of the tactic proof
-plus the diagnostics (i.e. warnings/errors) for the proof.
- -/
-def getProofState (_ : Lsp.PlainGoalParams) : RequestM (RequestTask (Option ProofState)) := do
- let doc ← readDoc
- let rc ← readThe RequestContext
- let text := doc.meta.text
-
- withWaitFindSnap
- doc
- -- TODO (Alex): I couldn't find a good condition to find the correct snap. So we are looking
- -- for the first snap with goals here.
- -- NOTE (Jon): The entire proof is in one snap, so hoped that Position `0` is good enough.
- (fun snap => ¬ (snap.infoTree.goalsAt? doc.meta.text 0).isEmpty)
- (notFoundX := return none)
- fun snap => do
- -- `snap` is the one snapshot containing the entire proof.
- let mut steps : Array <| InteractiveGoalsWithHints := #[]
-
- -- Question: Is there a difference between the diags of this snap and the last snap?
- -- Should we get the diags from there?
- -- Answer: The last snap only copied the diags from the end of this snap
- let mut diag : Array InteractiveDiagnostic := snap.interactiveDiags.toArray
-
- -- Level is completed if there are no errors or warnings
- let completedWithWarnings : Bool := ¬ diag.any (·.severity? == some .error)
- let completed : Bool := completedWithWarnings ∧ ¬ diag.any (·.severity? == some .warning)
-
- let mut intermediateGoalCount := 0
-
- -- only the positions that have non-whitespace characters since the last position
- -- should add a new proof step.
- let positionsWithSource : Array (String.Pos × String) :=
- text.positions.zipWithIndex.filterMap (
- fun (pos, i) => match i with
- | 0 => some (pos, "")
- | i' + 1 =>
- let source : String := Substring.toString ⟨text.source, text.positions.get! i', pos⟩
- if source.trim.length == 0 then
- none
- else
- some (pos, source))
-
- -- Drop the last position as we ensured that there is always a newline at the end
- for ((pos, source), i) in positionsWithSource.zipWithIndex do
- -- iterate over all steps in the proof and get the goals and hints at each position
-
- -- diags are labeled in Lsp-positions, which differ from the lean-internal
- -- positions by `1`.
- let lspPosAt := text.utf8PosToLspPos pos
-
- let mut diagsAtPos : Array InteractiveDiagnostic := filterUnsolvedGoal <|
- -- `+1` for getting the errors after the line.
- match i with
- | 0 =>
- -- `lspPosAt` is `(0, 0)`
- diag.filter (fun d => d.range.start == lspPosAt )
- | i' + 1 =>
- diag.filter (fun d =>
- ((text.utf8PosToLspPos <| (positionsWithSource.get! i').1) ≤ d.range.start) ∧
- d.range.start < lspPosAt )
-
- if let goalsAtResult@(_ :: _) := snap.infoTree.goalsAt? doc.meta.text pos then
- let goalsAtPos' : List <| List InteractiveGoalWithHints ← goalsAtResult.mapM
- fun { ctxInfo := ci, tacticInfo := tacticInfo, useAfter := useAfter, .. } => do
- -- TODO: What does this function body do?
- -- let ciAfter := { ci with mctx := ti.mctxAfter }
- let ci := if useAfter then
- { ci with mctx := tacticInfo.mctxAfter }
- else
- { ci with mctx := tacticInfo.mctxBefore }
- -- compute the interactive goals
- let goalMvars : List MVarId ← ci.runMetaM {} do
- return if useAfter then tacticInfo.goalsAfter else tacticInfo.goalsBefore
-
- let interactiveGoals : List InteractiveGoalWithHints ← ci.runMetaM {} do
- goalMvars.mapM fun goal => do
- let hints ← findHints goal doc.meta rc.initParams
- let interactiveGoal ← goalToInteractive goal
- return ⟨interactiveGoal, hints⟩
- -- TODO: This code is way old, can it be deleted?
- -- compute the goal diff
- -- let goals ← ciAfter.runMetaM {} (do
- -- try
- -- Widget.diffInteractiveGoals useAfter ti goals
- -- catch _ =>
- -- -- fail silently, since this is just a bonus feature
- -- return goals
- -- )
- return interactiveGoals
- let goalsAtPos : Array InteractiveGoalWithHints := ⟨goalsAtPos'.foldl (· ++ ·) []⟩
-
- diagsAtPos ← completionDiagnostics goalsAtPos.size intermediateGoalCount
- completed completedWithWarnings lspPosAt diagsAtPos
-
- intermediateGoalCount := goalsAtPos.size
-
- steps := steps.push ⟨goalsAtPos, source, diagsAtPos, lspPosAt.line, lspPosAt.character⟩
- else
- -- No goals present
- steps := steps.push ⟨#[], source, diagsAtPos, lspPosAt.line, none⟩
-
- -- Filter out the "unsolved goals" message
- diag := filterUnsolvedGoal diag
-
- let lastPos := text.utf8PosToLspPos positionsWithSource.back.1
- let remainingDiags : Array InteractiveDiagnostic :=
- diag.filter (fun d => lastPos ≤ d.range.start)
-
- return some {
- steps := steps,
- diagnostics := remainingDiags,
- completed := completed,
- completedWithWarnings := completedWithWarnings,
- lastPos := lastPos.line
- }
-
-open RequestM in
-
--- The editor apparently uses this
-def getInteractiveGoals (p : Lsp.PlainGoalParams) : RequestM (RequestTask (Option <| InteractiveGoals)) := do
- let doc ← readDoc
- -- let rc ← readThe RequestContext
- let text := doc.meta.text
- let hoverPos := text.lspPosToUtf8Pos p.position
- -- TODO: I couldn't find a good condition to find the correct snap. So we are looking
- -- for the first snap with goals here:
- withWaitFindSnap doc (fun s => ¬ (s.infoTree.goalsAt? doc.meta.text hoverPos).isEmpty)
- (notFoundX := return none) fun snap => do
- if let rs@(_ :: _) := snap.infoTree.goalsAt? doc.meta.text hoverPos then
- let goals : List <| Array InteractiveGoal ← rs.mapM fun { ctxInfo := ci, tacticInfo := ti, useAfter := useAfter, .. } => do
- let ciAfter := { ci with mctx := ti.mctxAfter }
- let ci := if useAfter then ciAfter else { ci with mctx := ti.mctxBefore }
- -- compute the interactive goals
- let goals ← ci.runMetaM {} do
- return List.toArray <| if useAfter then ti.goalsAfter else ti.goalsBefore
- let goals ← ci.runMetaM {} do
- goals.mapM fun goal => do
- -- let hints ← findHints goal doc.meta rc.initParams
- return ← goalToInteractive goal
- -- compute the goal diff
- -- let goals ← ciAfter.runMetaM {} (do
- -- try
- -- Widget.diffInteractiveGoals useAfter ti goals
- -- catch _ =>
- -- -- fail silently, since this is just a bonus feature
- -- return goals
- -- )
- return goals
- return some <| ⟨goals.foldl (· ++ ·) #[]⟩
- else
- return none
-
-builtin_initialize
- registerBuiltinRpcProcedure
- `Game.getInteractiveGoals
- Lsp.PlainGoalParams
- (Option <| InteractiveGoals
- )
- getInteractiveGoals
-
-builtin_initialize
- registerBuiltinRpcProcedure
- `Game.getProofState
- Lsp.PlainGoalParams
- (Option ProofState)
- getProofState
-
-
-end GameServer
diff --git a/server/GameServer/SaveData.lean b/server/GameServer/SaveData.lean
index c58cf266..31339a7c 100644
--- a/server/GameServer/SaveData.lean
+++ b/server/GameServer/SaveData.lean
@@ -1,9 +1,15 @@
+import GameServer.Config.SaveData
import GameServer.EnvExtensions
import I18n
+namespace GameServer
+
open Lean Meta Elab Command
-/-! ## Copy images -/
+/-! ## Save data
+
+Compare to `GameServerExe.LoadData`
+-/
open IO.FS System FilePath in
/-- Copies the folder `images/` to `.lake/gamedata/images/` -/
@@ -22,17 +28,9 @@ def copyImages : IO Unit := do
let content ← readBinFile file
writeBinFile outFile content
-namespace GameData
- def gameDataPath : System.FilePath := ".lake" / "gamedata"
- def gameFileName := s!"game.json"
- def docFileName := fun (inventoryType : InventoryType) (name : Name) => s!"doc__{inventoryType}__{name}.json"
- def levelFileName := fun (worldId : Name) (levelId : Nat) => s!"level__{worldId}__{levelId}.json"
- def inventoryFileName := s!"inventory.json"
-end GameData
-
open GameData in
-- TODO: register all of this as ToJson instance?
-def saveGameData (allItemsByType : HashMap InventoryType (HashSet Name))
+def saveGameData (allItemsByType : Std.HashMap InventoryType (Std.HashSet Name))
(inventory : InventoryOverview): CommandElabM Unit := do
let game ← getCurGame
let env ← getEnv
@@ -51,31 +49,13 @@ def saveGameData (allItemsByType : HashMap InventoryType (HashSet Name))
IO.FS.writeFile (path / gameFileName) (toString (getGameJson game))
- for inventoryType in [InventoryType.Lemma, .Tactic, .Definition] do
- for name in allItemsByType.findD inventoryType {} do
+ for inventoryType in [InventoryType.Theorem, .Tactic, .Definition] do
+ for name in allItemsByType.getD inventoryType {} do
let some item ← getInventoryItem? name inventoryType
- | throwError "Expected item to exist: {name}"
+ | continue -- TODO: cleanup. Hidden items should also not appear in `allItemsByType`
IO.FS.writeFile (path / docFileName inventoryType name) (toString (toJson item))
IO.FS.writeFile (path / inventoryFileName) (toString (toJson inventory))
-- write file for translation
I18n.createTemplate
-
-open GameData
-
-def loadData (f : System.FilePath) (α : Type) [FromJson α] : IO α := do
- let str ← IO.FS.readFile f
- let json ← match Json.parse str with
- | .ok v => pure v
- | .error e => throw (IO.userError e)
- let data ← match fromJson? json with
- | .ok v => pure v
- | .error e => throw (IO.userError e)
- return data
-
-def loadGameData (gameDir : System.FilePath) : IO Game :=
- loadData (gameDir / gameDataPath / gameFileName) Game
-
-def loadLevelData (gameDir : System.FilePath) (worldId : Name) (levelId : Nat) : IO LevelInfo :=
- loadData (gameDir / gameDataPath / levelFileName worldId levelId) LevelInfo
diff --git a/server/GameServer/Structures.lean b/server/GameServer/Structures.lean
deleted file mode 100644
index 49ce1879..00000000
--- a/server/GameServer/Structures.lean
+++ /dev/null
@@ -1,102 +0,0 @@
-import Lean.Widget.InteractiveGoal
-import Lean.Widget.InteractiveDiagnostic
-import Lean.Data.Lsp.Diagnostics
-
-/-!
-This file contains the custom data structures use by the server.
-
-Some of them overwrite built-in structures from Lean.
-
-In particular, the structures from `Lean.Widget.InteractiveGoal` are duplicated with
-the following extension:
-
-* `isAssumption?` in `InteractiveHypothesisBundle`: stores if a hypothesis is of type `Prop`.
-
-NOTE: Changes here need to be reflected in the corresponding `interface` in `rcp_api.ts`
-on the client-side.
--/
-
-open Lean Server Widget
-
-namespace GameServer
-
-/-- Extend the interactive hypothesis bundle with an option to distinguish
-"assumptions" from "objects". "Assumptions" are hypotheses of type `Prop`. -/
--- @[inherit_doc Lean.Widget.InteractiveHypothesisBundle]
-structure InteractiveHypothesisBundle extends Lean.Widget.InteractiveHypothesisBundle where
- /-- The hypothesis's type is of type `Prop` -/
- isAssumption? : Option Bool := none
-deriving RpcEncodable
-
--- duplicated but with custom `InteractiveHypothesisBundle`
-@[inherit_doc Lean.Widget.InteractiveGoalCore]
-structure InteractiveGoalCore where
- hyps : Array InteractiveHypothesisBundle
- type : CodeWithInfos
- ctx : WithRpcRef Elab.ContextInfo
-
--- duplicated but with custom `InteractiveGoalCore`
-@[inherit_doc Lean.Widget.InteractiveGoal]
-structure InteractiveGoal extends InteractiveGoalCore where
- userName? : Option String
- goalPrefix : String
- mvarId : MVarId
- isInserted? : Option Bool := none
- isRemoved? : Option Bool := none
-deriving RpcEncodable
-
--- duplicated with custom `InteractiveGoalCore`
-@[inherit_doc Lean.Widget.InteractiveTermGoal]
-structure InteractiveTermGoal extends InteractiveGoalCore where
- range : Lsp.Range
- term : WithRpcRef Elab.TermInfo
-deriving RpcEncodable
-
-/-- A hint in the game at the corresponding goal. -/
-structure GameHint where
- /-- The text with the variable names already inserted.
-
- Note: This is in theory superfluous and will be completely replaced by `rawText`. We just left
- it in for debugging for now. -/
- text : String
- /-- Flag whether the hint should be hidden initially. -/
- hidden : Bool
- /-- The text with the variables not inserted yet. -/
- rawText : String
- /-- The assignment of variable names in the `rawText` to the ones the player used. -/
- varNames : Array <| Name × Name
-deriving FromJson, ToJson
-
-/-- Bundled `InteractiveGoal` together with an array of hints that apply at this stage. -/
-structure InteractiveGoalWithHints where
- goal : InteractiveGoal
- /-- Extended the `InteractiveGoal` by an array of hints at that goal. -/
- hints : Array GameHint
-deriving RpcEncodable
-
-structure InteractiveGoalsWithHints where
- goals : Array InteractiveGoalWithHints
- /-- The content of the line evaluated. -/
- command : String
- diags : Array InteractiveDiagnostic := default
- line : Option Nat -- only for debugging
- column : Option Nat -- only for debugging
-
-deriving RpcEncodable
-
-instance : Inhabited InteractiveGoalsWithHints := ⟨default, default, default, none, none⟩
-
-/-- Collected goals throughout the proof. Used for communication with the game client. -/
-structure ProofState where
- /-- goals after each line. includes the hints. -/
- steps : Array <| InteractiveGoalsWithHints
- /-- diagnostics contains all errors and warnings.
-
- TODO: I think they contain information about which line they belong to. Verify this.
- -/
- diagnostics : Array InteractiveDiagnostic := default
- /-- Whether the level is considered solved. -/
- completed : Bool
- completedWithWarnings : Bool
- lastPos : Nat -- only for debugging
-deriving RpcEncodable
diff --git a/server/GameServer/Tactic.lean b/server/GameServer/Tactic.lean
new file mode 100644
index 00000000..7c4016d6
--- /dev/null
+++ b/server/GameServer/Tactic.lean
@@ -0,0 +1,5 @@
+import GameServer.Tactic.Branch
+import GameServer.Tactic.Hint.Basic
+import GameServer.Tactic.Hint.Defs
+import GameServer.Tactic.LetIntros
+import GameServer.Tactic.Template
diff --git a/server/GameServer/Tactic/Branch.lean b/server/GameServer/Tactic/Branch.lean
new file mode 100644
index 00000000..56734a39
--- /dev/null
+++ b/server/GameServer/Tactic/Branch.lean
@@ -0,0 +1,23 @@
+import Lean
+
+namespace GameServer
+
+open Lean Elab
+
+/-- This tactic allows us to execute an alternative sequence of tactics, but without affecting the
+proof state. We use it to define Hints for alternative proof methods or dead ends. -/
+elab (name := GameServer.Tactic.Branch) "Branch" t:tacticSeq : tactic => do
+ let b ← saveState
+ Tactic.evalTactic t
+
+ -- Show an info whether the branch proofs all remaining goals.
+ let gs ← Tactic.getUnsolvedGoals
+ if gs.isEmpty then
+ -- trace[debug] "This branch finishes the proof."
+ pure ()
+ else
+ trace[debug] "This branch leaves open goals."
+
+ let msgs ← Core.getMessageLog
+ b.restore
+ Core.setMessageLog msgs
diff --git a/server/GameServer/Tactic/Hint/Basic.lean b/server/GameServer/Tactic/Hint/Basic.lean
new file mode 100644
index 00000000..094f6810
--- /dev/null
+++ b/server/GameServer/Tactic/Hint/Basic.lean
@@ -0,0 +1,63 @@
+import GameServer.Tactic.Hint.Defs
+import GameServer.Lean.String
+
+namespace GameServer
+
+open Lean Meta Elab Command
+
+/--
+A tactic that can be used inside `Statement`s to indicate in which proof states players should
+see hints. The tactic does not affect the goal state.
+-/
+elab (name := GameServer.Tactic.Hint) "Hint" args:hintArg* msg:interpolatedStr(term) : tactic => do
+ let mut strict := false
+ let mut hidden := false
+ let mut defeq := true
+
+ -- remove spaces at the beginning of new lines
+ let msg := TSyntax.mk $ msg.raw.setArgs $ ← msg.raw.getArgs.mapM fun m => do
+ match m with
+ | Syntax.node info k args =>
+ if k == interpolatedStrLitKind && args.size == 1 then
+ match args.get! 0 with
+ | (Syntax.atom info' val) =>
+ let val := val.removeIndentation
+ return Syntax.node info k #[Syntax.atom info' val]
+ | _ => return m
+ else
+ return m
+ | _ => return m
+
+ for arg in args do
+ match arg with
+ | `(hintArg| (strict := true)) => strict := true
+ | `(hintArg| (strict := false)) => strict := false
+ | `(hintArg| (hidden := true)) => hidden := true
+ | `(hintArg| (hidden := false)) => hidden := false
+ | `(hintArg| (defeq := true)) => defeq := true
+ | `(hintArg| (defeq := false)) => defeq := false
+ | _ => throwUnsupportedSyntax
+
+ let goal ← Tactic.getMainGoal
+ goal.withContext do
+ -- We construct an expression that can produce the hint text. The difficulty is that we
+ -- want the text to possibly contain quotation of the local variables which might have been
+ -- named differently by the player.
+ let varsName := `vars
+ let text ← withLocalDeclD varsName (mkApp (mkConst ``Array [levelZero]) (mkConst ``Expr)) fun vars => do
+ let mut text ← `(m! $msg)
+ let goalDecl ← goal.getDecl
+ let decls := goalDecl.lctx.decls.toArray.filterMap id
+ for i in [:decls.size] do
+ text ← `(let $(mkIdent decls[i]!.userName) := $(mkIdent varsName)[$(quote i)]!; $text)
+ return ← mkLambdaFVars #[vars] $ ← Term.elabTermAndSynthesize text none
+ let textmvar ← mkFreshExprMVar none
+ guard $ ← isDefEq textmvar text -- Store the text in a mvar.
+ -- The information about the hint is logged as a message using `logInfo` to transfer it to the
+ -- `Statement` command:
+ logInfo $
+ .tagged `Hint $
+ .nest (if strict then 1 else 0) $
+ .nest (if hidden then 1 else 0) $
+ .nest (if defeq then 1 else 0) $
+ .compose (.ofGoal textmvar.mvarId!) (.ofGoal goal)
diff --git a/server/GameServer/Hints.lean b/server/GameServer/Tactic/Hint/Defs.lean
similarity index 65%
rename from server/GameServer/Hints.lean
rename to server/GameServer/Tactic/Hint/Defs.lean
index 176d8ec1..4d53e900 100644
--- a/server/GameServer/Hints.lean
+++ b/server/GameServer/Tactic/Hint/Defs.lean
@@ -1,6 +1,8 @@
-import GameServer.AbstractCtx
+import GameServer.Util.AbstractCtx
/-!
+# Hint tactic
+
This file contains anything related to the `Hint` tactic used to add hints to a game level.
-/
@@ -8,7 +10,7 @@ open Lean Meta Elab
namespace GameServer
-syntax hintArg := atomic(" (" (&"strict" <|> &"hidden") " := " withoutPosition(term) ")")
+syntax hintArg := atomic(" (" (&"strict" <|> &"hidden" <|> &"defeq") " := " withoutPosition(term) ")")
/-- A hint to help the user with a specific goal state -/
structure GoalHintEntry where
@@ -20,6 +22,7 @@ structure GoalHintEntry where
hidden : Bool := false
/-- If true, then the goal must contain only the assumptions specified in `goal` and no others -/
strict : Bool := false
+ defeq : Bool := true
instance : Repr GoalHintEntry := {
reprPrec := fun a n => reprPrec a.text n
@@ -35,20 +38,5 @@ unsafe def evalHintMessageUnsafe : Expr → MetaM (Array Expr → MessageData) :
(.forallE default (mkApp (mkConst ``Array [levelZero]) (mkConst ``Expr))
(mkConst ``MessageData) .default)
-@[implemented_by evalHintMessageUnsafe]
+@[implemented_by evalHintMessageUnsafe, inherit_doc evalHintMessageUnsafe]
def evalHintMessage : Expr → MetaM (Array Expr → MessageData) := fun _ => pure (fun _ => "")
-
-/-- Remove any spaces at the beginning of a new line -/
-partial def removeIndentation (s : String) : String :=
- let rec loop (i : String.Pos) (acc : String) (removeSpaces := false) : String :=
- let c := s.get i
- let i := s.next i
- if s.atEnd i then
- acc.push c
- else if removeSpaces && c == ' ' then
- loop i acc (removeSpaces := true)
- else if c == '\n' then
- loop i (acc.push c) (removeSpaces := true)
- else
- loop i (acc.push c)
- loop ⟨0⟩ ""
diff --git a/server/GameServer/Tactic/Template.lean b/server/GameServer/Tactic/Template.lean
new file mode 100644
index 00000000..27ea8337
--- /dev/null
+++ b/server/GameServer/Tactic/Template.lean
@@ -0,0 +1,48 @@
+import GameServer.Layer.Extension
+
+namespace GameServer
+
+open Lean Elab
+
+/-- A hole inside a template proof that will be replaced by `sorry`. -/
+elab (name := GameServer.Tactic.Hole) "Hole" t:tacticSeq : tactic => do
+ Tactic.evalTactic t
+
+/--
+Iterate recursively through the Syntax, replace `Hole` with `sorry` and remove all
+`Hint`/`Branch` occurrences.
+-/
+def replaceHoles (tacs : Syntax) : Syntax :=
+ match tacs with
+ | Syntax.node info kind ⟨args⟩ =>
+ let newArgs := filterArgs args
+ Syntax.node info kind ⟨newArgs⟩
+ | other => other
+where filterArgs (args : List Syntax) : List Syntax :=
+ match args with
+ | [] => []
+ -- replace `Hole` with `sorry`.
+ | Syntax.node info `GameServer.Tactic.Hole _ :: r =>
+ Syntax.node info `Lean.Parser.Tactic.tacticSorry #[Syntax.atom info "sorry"] :: filterArgs r
+ -- delete all `Hint` and `Branch` occurrences in the middle.
+ | Syntax.node _ `GameServer.Tactic.Hint _ :: _ :: r
+ | Syntax.node _ `GameServer.Tactic.Branch _ :: _ :: r =>
+ filterArgs r
+ -- delete `Hint` and `Branch` occurrence at the end of the tactic sequence.
+ | Syntax.node _ `GameServer.Tactic.Hint _ :: []
+ | Syntax.node _ `GameServer.Tactic.Branch _ :: [] =>
+ []
+ -- Recurse on all other Syntax.
+ | a :: rest =>
+ replaceHoles a :: filterArgs rest
+
+/-- The tactic block inside `Template` will be copied into the users editor.
+Use `Hole` inside the template for a part of the proof that should be replaced
+with `sorry`. -/
+elab "Template" tacs:tacticSeq : tactic => do
+ Tactic.evalTactic tacs
+ let newTacs : TSyntax `Lean.Parser.Tactic.tacticSeq := ⟨replaceHoles tacs.raw⟩
+ let template ← PrettyPrinter.ppCategory `Lean.Parser.Tactic.tacticSeq newTacs
+ trace[debug] s!"Template:\n{template}"
+ modifyLevel (←getCurLevelId) fun level => do
+ return {level with template := s!"{template}"}
diff --git a/server/GameServer/Utils.lean b/server/GameServer/Util.lean
similarity index 91%
rename from server/GameServer/Utils.lean
rename to server/GameServer/Util.lean
index 9891ecbc..4dbb0759 100644
--- a/server/GameServer/Utils.lean
+++ b/server/GameServer/Util.lean
@@ -1,4 +1,7 @@
import Lean
+import GameServer.Util.AbstractCtx
+import GameServer.Util.CommandNotDuplicated
+import GameServer.Util.Graph
open Lean Meta Elab Tactic Command
@@ -35,7 +38,7 @@ elab "#show_option" verbose:(ppSpace showOptArg)? id:(ppSpace Parser.rawIdent)?
| .ofNat val => s!"Nat := {repr val}"
| .ofInt val => s!"Int := {repr val}"
| .ofSyntax val => s!"Syntax := {repr val}"
- if let some val := opts.find name then
+ if let some val := opts.find (.mkSimple name) then
msg1 := s!"{msg1} (currently: {val})"
msg := match verbose with
| some opt =>
diff --git a/server/GameServer/AbstractCtx.lean b/server/GameServer/Util/AbstractCtx.lean
similarity index 84%
rename from server/GameServer/AbstractCtx.lean
rename to server/GameServer/Util/AbstractCtx.lean
index 763fb9dc..f45715a9 100644
--- a/server/GameServer/AbstractCtx.lean
+++ b/server/GameServer/Util/AbstractCtx.lean
@@ -1,12 +1,17 @@
import Lean
-import GameServer.Utils
-section AbstractCtx
-open Lean
-open Meta
+/-!
+# Abstract Context
-structure AbstractCtxResult :=
- (abstractMVarsResult : AbstractMVarsResult)
+TODO: describe
+-/
+
+namespace GameServer
+
+open Lean Meta
+
+structure AbstractCtxResult where
+ abstractMVarsResult : AbstractMVarsResult
/-- Abstract LCtx and MCtx to transport an expression into different contexts -/
def abstractCtx (goal : MVarId) : MetaM AbstractCtxResult := do
@@ -23,5 +28,3 @@ def openAbstractCtxResult (res : AbstractCtxResult) (k : Array Expr → Expr →
lambdaLetTelescope (← instantiateMVars expr) k
-- TODO: Unfortunately, lambdaLetTelescope does not allow us to provide the number of arguments.
-- If the goal is a function, this will not work.
-
-end AbstractCtx
diff --git a/server/GameServer/Util/CommandNotDuplicated.lean b/server/GameServer/Util/CommandNotDuplicated.lean
new file mode 100644
index 00000000..d4d62ef5
--- /dev/null
+++ b/server/GameServer/Util/CommandNotDuplicated.lean
@@ -0,0 +1,10 @@
+import Lean
+
+namespace GameServer
+
+open Lean Elab Command
+
+def checkCommandNotDuplicated (items : Array Name) (cmd := "Command") : CommandElabM Unit := do
+ if ¬ items.isEmpty then
+ logWarning <| s!"You should only use one `{cmd}` per level, " ++
+ "but it can take multiple arguments: `{cmd} obj₁ obj₂ obj₃`!"
diff --git a/server/GameServer/Util/Graph.lean b/server/GameServer/Util/Graph.lean
new file mode 100644
index 00000000..b6898f78
--- /dev/null
+++ b/server/GameServer/Util/Graph.lean
@@ -0,0 +1,58 @@
+import Lean
+
+open Lean Meta
+
+/-!
+## Graph
+
+This file provides a directed graph `Graph α β`, which works with keys of type `α` and each
+node of the graph has an object of type `β` attached to it.
+
+The keys need to be hashable, but the values from `β` do not need to be.
+-/
+
+/--
+A (directed) `Graph` consists of notes and edges between these notes.
+
+The edges work on keys (of type `α`) and each note has a value (of type `β`) attached
+to this key in order to allow graphs with non-hashable values.
+-/
+structure Graph (α β : Type _) [BEq α] [Hashable α] where
+ nodes: Std.HashMap α β := ∅
+ edges: Std.HashSet (α × α) := ∅
+deriving Inhabited
+
+variable [BEq α] [Hashable α]
+
+instance : EmptyCollection (Graph α β) := ⟨default⟩
+
+instance [ToString α] [ToJson α] [ToJson β] : ToJson (Graph α β) where
+ toJson graph := Json.mkObj [
+ ("nodes", Json.mkObj <| graph.nodes.toList.map fun (key, value) => (s!"{key}", toJson value)),
+ ("edges", toJson graph.edges.toList)]
+
+-- TODO: Just a dummy implementation for now
+instance : FromJson (Graph Name β) where
+ fromJson? _ := .ok {
+ nodes := ∅
+ edges := ∅}
+
+/--
+Insert a node with no edges to or from it. Replaces an existing node.
+-/
+def Graph.insertNode (graph : Graph α β) (a : α) (b : β) : Graph α β :=
+ {graph with nodes := graph.nodes.insert a b}
+
+/--
+Find all nodes of the `graph` that have a (transitive) connection to `node`.
+The key `node` itself is not included in the result.
+-/
+partial def Graph.predecessors (graph : Graph α β) (node : α) (acc : Std.HashSet α := ∅) :
+ Std.HashSet α := Id.run do
+ let mut res : Std.HashSet α := acc
+ -- iterate over all direct predecessors
+ for (source, _) in (graph.edges.filter (·.2 == node)) do
+ if !(res.contains source) then
+ res := res.insert source
+ res := graph.predecessors source res
+ return res
diff --git a/server/GameServerExe.lean b/server/GameServerExe.lean
new file mode 100644
index 00000000..9a91aa46
--- /dev/null
+++ b/server/GameServerExe.lean
@@ -0,0 +1,85 @@
+import GameServerExe.Rpc
+import GameServer
+import GameServerExe.Message
+import Lake.CLI.Main
+
+-- TODO: The only reason we import `Commands` is so that it gets built to on `lake build`
+-- should we have a different solution?
+
+open Lean System.FilePath IO
+
+open Lake
+
+/--
+Game Server Proxy. Redirects messages between the client and a child process running
+the Lean language server.
+
+Note: we use the code from `Lake.serve` to create a child process `leanProcess`
+-/
+unsafe def main : List String → IO UInt32 := fun args => do
+ Lean.enableInitializersExecution
+
+ let gameDir :: argsᵣ := args
+ | do
+ IO.eprintln "ERROR: expected at least one argument"
+ IO.Process.exit 1
+
+ let i ← IO.getStdin
+ let o ← IO.getStdout
+ let e ← IO.getStderr
+
+ debug_msg s!"game directory: {gameDir}"
+
+ try
+ let (elanInstall?, leanInstall?, lakeInstall?) ← findInstall?
+ let config ← MonadError.runEIO <| mkLoadConfig { elanInstall?, leanInstall?, lakeInstall? }
+
+ -- copied from: `Lake.serve config args.toArray`
+ let (extraEnv, moreServerArgs) ← do
+ let (ws?, log) ← (loadWorkspace config).captureLog
+ log.replay (logger := MonadLog.stderr)
+ if let some ws := ws? then
+ let ctx := mkLakeContext ws
+ pure (← LakeT.run ctx getAugmentedEnv, ws.root.moreGlobalServerArgs)
+ else
+ IO.eprintln "warning: package configuration has errors, falling back to plain `lean --server`"
+ pure (config.lakeEnv.baseVars.push (invalidConfigEnvVar, log.toString), #[])
+ let leanProcess ← IO.Process.spawn {
+ cmd := config.lakeEnv.lean.lean.toString
+ args := #["--server"] ++ moreServerArgs ++ argsᵣ
+ env := extraEnv
+ stdin := IO.Process.Stdio.piped
+ stdout := IO.Process.Stdio.piped
+ -- stderr := IO.Process.Stdio.piped
+ }
+
+ let i_lean : IO.FS.Stream := .ofHandle leanProcess.stdin
+ let o_lean : IO.FS.Stream := .ofHandle leanProcess.stdout
+ -- let e_lean : IO.FS.Stream := .ofHandle leanProcess.stderr
+
+ -- Test: import game info from `Game`'s env
+ initSearchPath (← findSysroot)
+ unsafe Lean.withImportModules #[`TestGame] {} (trustLevel := 1024) -- TODO: What's the correct module?
+ fun env => Prod.fst <$> Core.CoreM.toIO
+ ( ctx := { fileName := "", fileMap := default })
+ (s := { env := env }) do
+
+ -- get the game from the Env
+ let game ← GameServer.getCurGame
+ debug_msg s!"cwd: {(← IO.currentDir)}"
+
+ while true do
+ /- redirect message from the client to the server -/
+ let msgI : JsonRpc.Message ← GameServer.forwardMessage (← i.readLspMessage)
+ i_lean.writeLspMessage msgI
+
+ let msgO : JsonRpc.Message ← GameServer.returnMessage (← o_lean.readLspMessage)
+ o.writeLspMessage msgO
+
+ -- let msgE : JsonRpc.Message ← e_lean.readLspMessage
+ -- e.writeLspMessage msgE
+
+ IO.Process.exit 0
+ catch err =>
+ e.putStrLn s!"GameServer error: {err}"
+ IO.Process.exit 1
diff --git a/server/GameServerExe/FileWorker.lean b/server/GameServerExe/FileWorker.lean
new file mode 100644
index 00000000..42f1e542
--- /dev/null
+++ b/server/GameServerExe/FileWorker.lean
@@ -0,0 +1,904 @@
+-- /- This file is adapted from `Lean/Server/FileWorker.lean`. -/
+-- import Lean.Server.FileWorker
+import GameServerExe.Lsp
+import GameServerExe.Rpc
+import GameServerExe.State
+import GameServerExe.ImportModules
+import GameServerExe.LoadData
+import GameServer.EnvExtensions
+import GameServer.Tactic.LetIntros
+import GameServerExe.Lean.Message
+
+-- namespace MyModule
+
+open Lean
+open Elab
+open Parser
+
+-- private def mkErrorMessage (c : InputContext) (pos : String.Pos) (errorMsg : String) : Message :=
+-- let pos := c.fileMap.toPosition pos
+-- { fileName := c.fileName, pos := pos, data := errorMsg }
+
+-- private def mkEOI (pos : String.Pos) : Syntax :=
+-- let atom := mkAtom (SourceInfo.original "".toSubstring pos "".toSubstring pos) ""
+-- mkNode ``Command.eoi #[atom]
+
+-- partial def parseTactic (inputCtx : InputContext) (pmctx : ParserModuleContext)
+-- (mps : ModuleParserState) (messages : MessageLog) :
+-- Syntax × ModuleParserState × MessageLog × String.Pos := Id.run do
+-- let mut pos := mps.pos
+-- let mut recovering := mps.recovering
+-- let mut messages := messages
+-- let mut stx := Syntax.missing -- will always be assigned below
+
+-- let tokens := getTokenTable pmctx.env
+
+-- let s := whitespace.run inputCtx pmctx tokens { cache := initCacheForInput inputCtx.input, pos }
+-- let endOfWhitespace := s.pos
+
+-- let p := (Tactic.sepByIndentSemicolon tacticParser).fn
+-- let s := p.run inputCtx pmctx tokens { cache := initCacheForInput inputCtx.input, pos }
+
+-- match s.errorMsg with
+-- | none =>
+-- stx := s.stxStack.back
+-- recovering := false
+-- | some errorMsg =>
+-- messages := messages.add <| mkErrorMessage inputCtx s.pos (toString errorMsg)
+-- recovering := true
+-- stx := s.stxStack.back
+-- if ¬ inputCtx.input.atEnd s.pos then
+-- messages := messages.add <| mkErrorMessage inputCtx s.pos "end of input"
+-- return (stx, { pos := inputCtx.input.endPos, recovering }, messages, endOfWhitespace)
+
+-- end MyModule
+
+namespace GameServer.FileWorker
+
+-- open Lean
+-- open Lean.Server
+-- open Lean.Server.FileWorker
+-- open Lsp
+-- open IO
+-- open Snapshots
+-- open JsonRpc
+
+-- /--
+-- Game-specific state to be packed on top of the `Server.FileWorker.WorkerState`
+-- used by the Lean server.
+-- -/
+-- structure WorkerState where
+-- /--
+-- Collection of items which are considered unlocked.
+-- Tactics and theorems are mixed together.
+-- -/
+-- inventory : Array String
+-- /--
+-- Difficulty determines whether tactics/theorems can be locked.
+-- * 0: do not check
+-- * 1: give warnings when locked items are used
+-- * 2: give errors when locked items are used
+-- -/
+-- difficulty : Nat
+-- /--
+-- `levelInfo` contains all the (static) information about the level which is not influenced
+-- by the user's progress.
+-- -/
+-- levelInfo : LevelInfo
+-- deriving ToJson, FromJson
+
+-- /--
+-- Pack the our custom `WorkerState` on top of the normal worker monad
+-- `Server.FileWorker.WorkerM`.
+-- -/
+-- abbrev WorkerM := StateT WorkerState Server.FileWorker.WorkerM
+
+-- section Elab
+
+-- /-- Add a message. use `(severity := .warning)` to specify the severity-/
+-- def addMessage (info : SourceInfo) (inputCtx : Parser.InputContext)
+-- (severity := MessageSeverity.warning) (s : MessageData) :
+-- Elab.Command.CommandElabM Unit := do
+-- modify fun st => { st with
+-- messages := st.messages.add {
+-- fileName := inputCtx.fileName
+-- severity := severity
+-- pos := inputCtx.fileMap.toPosition (info.getPos?.getD 0)
+-- data := s }}
+
+-- -- TODO: use HashSet for allowed tactics?
+-- /--
+-- Find all tactics in syntax object that are forbidden according to a
+-- set `allowed` of allowed tactics.
+-- -/
+-- partial def findForbiddenTactics (inputCtx : Parser.InputContext) (workerState : WorkerState)
+-- (stx : Syntax) : Elab.Command.CommandElabM Unit := do
+-- let levelInfo := workerState.levelInfo
+-- -- Parse the syntax object and look for tactics and declarations.
+-- match stx with
+-- | .missing => return ()
+-- | .node _info _kind args =>
+-- -- Go inside a node.
+-- for arg in args do
+-- findForbiddenTactics inputCtx workerState arg
+-- | .atom info val =>
+-- -- Atoms might be tactic names or other keywords.
+-- -- Note: We whitelisted known keywords because we cannot
+-- -- distinguish keywords from tactic names.
+-- let allowed := GameServer.ALLOWED_KEYWORDS
+-- -- Ignore syntax elements that do not start with a letter or are listed above.
+-- if 0 < val.length ∧ val.data[0]!.isAlpha ∧ not (allowed.contains val) then
+-- -- Treat `simp?` and `simp!` like `simp`
+-- let val := val.dropRightWhile (fun c => c == '!' || c == '?')
+-- match levelInfo.tactics.find? (·.name.toString == val) with
+-- | none =>
+-- -- Tactic will never be introduced in the game.
+-- match workerState.inventory.find? (· == val) with
+-- | some _ =>
+-- -- Tactic is in the inventory, allow it.
+-- -- Note: This case shouldn't be possible...
+-- pure ()
+-- | none =>
+-- -- Tactic is not in the inventory.
+-- addMessageByDifficulty info s!"The tactic '{val}' is not available in this game!"
+-- | some tac =>
+-- -- Tactic is introduced at some point in the game.
+-- if tac.disabled then
+-- -- Tactic is disabled in this level.
+-- addMessageByDifficulty info s!"The tactic '{val}' is disabled in this level!"
+-- else if tac.locked then
+-- match workerState.inventory.find? (· == val) with
+-- | none =>
+-- -- Tactic is marked as locked and not in the inventory.
+-- addMessageByDifficulty info s!"You have not unlocked the tactic '{val}' yet!"
+-- | some _ =>
+-- -- Tactic is in the inventory, allow it.
+-- pure ()
+-- | .ident info _rawVal val _preresolved =>
+-- -- Try to resolve the name
+-- let ns ←
+-- try resolveGlobalConst (mkIdent val)
+-- -- Catch "unknown constant" error
+-- catch | _ => pure []
+-- for n in ns do
+-- let some (.thmInfo ..) := (← getEnv).find? n
+-- -- Not a theorem, no checks needed.
+-- | return ()
+-- if some (n.toString) = levelInfo.statementName then
+-- -- Forbid the theorem we are proving currently
+-- addMessage info inputCtx (severity := .error)
+-- s!"Structural recursion: you can't use '{n}' to proof itself!"
+-- let theoremsAndDefs := levelInfo.theorems ++ levelInfo.definitions
+-- match theoremsAndDefs.find? (·.name == n) with
+-- | none =>
+-- -- Theorem will never be introduced in this game
+-- addMessageByDifficulty info s!"The theorem/definition '{n}' is not available in this game!"
+-- | some thm =>
+-- -- Theorem is introduced at some point in the game.
+-- if thm.disabled then
+-- -- Theorem is disabled in this level.
+-- addMessageByDifficulty info s!"The theorem/definition '{n}' is disabled in this level!"
+-- else if thm.locked then
+-- match workerState.inventory.find? (· == n.toString) with
+-- | none =>
+-- -- Theorem is still locked.
+-- addMessageByDifficulty info s!"You have not unlocked the theorem/definition '{n}' yet!"
+-- | some _ =>
+-- -- Theorem is in the inventory, allow it.
+-- pure ()
+
+-- where addMessageByDifficulty (info : SourceInfo) (s : MessageData) :=
+-- -- See `GameServer.FileWorker.WorkerState.difficulty`. Send nothing/warnings/errors
+-- -- deppending on difficulty.
+-- let difficulty := workerState.difficulty
+-- if difficulty > 0 then
+-- addMessage info inputCtx (if difficulty > 1 then .error else .warning) s
+-- else pure ()
+
+-- open Elab Meta Expr in
+
+-- def compileProof (inputCtx : Parser.InputContext) (snap : Snapshot) (hasWidgets : Bool)
+-- (couldBeEndSnap : Bool) (gameWorkerState : WorkerState)
+-- (initParams : Lsp.InitializeParams) : IO Snapshot := do
+-- -- Recognize end snap
+-- if inputCtx.input.atEnd snap.mpState.pos ∧ couldBeEndSnap then
+-- let endSnap : Snapshot := {
+-- -- beginPos := snap.mpState.pos
+-- stx := MyModule.mkEOI snap.mpState.pos
+-- mpState := snap.mpState
+-- cmdState := snap.cmdState
+-- -- interactiveDiags := ← withNewInteractiveDiags snap.msgLog
+-- -- tacticCache := snap.tacticCache
+-- }
+-- return endSnap
+
+-- let parseResultRef ← IO.mkRef (Syntax.missing, snap.mpState)
+
+-- let cmdStateRef ← IO.mkRef snap.cmdState
+-- /- The same snapshot may be executed by different tasks. So, to make sure `elabCommandTopLevel` has exclusive
+-- access to the cache, we create a fresh reference here. Before this change, the
+-- following `snap.tacticCache.modify` would reset the tactic post cache while another snapshot was still using it. -/
+-- -- let tacticCacheNew ← IO.mkRef (← snap.tacticCache.get)
+-- let cmdCtx : Elab.Command.Context := {
+-- cmdPos := snap.endPos
+-- fileName := inputCtx.fileName
+-- fileMap := inputCtx.fileMap
+-- tacticCache? := none -- some tacticCacheNew
+-- snap? := none
+-- cancelTk? := none
+-- }
+-- let (output, _) ← IO.FS.withIsolatedStreams (isolateStderr := server.stderrAsMessages.get snap.cmdState.scopes.head!.opts) <| liftM (m := BaseIO) do
+-- Elab.Command.catchExceptions
+-- (getResetInfoTrees *> do
+-- let some level ← GameServer.getLevelByFileName? initParams inputCtx.fileName
+-- | panic! s!"Level not found: {inputCtx.fileName} / {GameServer.levelIdFromFileName? initParams inputCtx.fileName}"
+-- let scope := level.scope
+
+-- -- use open namespaces and options as in the level file
+-- Elab.Command.withScope (fun _ => scope) do
+-- for od in scope.openDecls do
+-- let .simple ns _ := od
+-- | pure ()
+-- activateScoped ns
+-- activateScoped scope.currNamespace
+
+-- -- parse tactics
+-- let pmctx := {
+-- env := ← getEnv,
+-- options := scope.opts,
+-- currNamespace := scope.currNamespace,
+-- openDecls := scope.openDecls }
+-- let (tacticStx, cmdParserState, msgLog, endOfWhitespace) :=
+-- MyModule.parseTactic inputCtx pmctx snap.mpState snap.msgLog
+-- modify (fun s => { s with messages := msgLog })
+-- parseResultRef.set (tacticStx, cmdParserState)
+
+-- -- Check for forbidden tactics
+-- findForbiddenTactics inputCtx gameWorkerState tacticStx
+
+-- -- Insert invisible `skip` command to make sure we always display the initial goal
+-- let skip := Syntax.node (.original default 0 default endOfWhitespace) ``Lean.Parser.Tactic.skip #[]
+-- -- Insert final `done` command to display unsolved goal error in the end
+-- let done := Syntax.node (.synthetic cmdParserState.pos cmdParserState.pos) ``Lean.Parser.Tactic.done #[]
+-- let tacticStx := (#[skip] ++ tacticStx.getArgs ++ #[done]).map (⟨.⟩)
+-- let tacticStx' := ← `(Lean.Parser.Tactic.tacticSeq| $[$(tacticStx)]*)
+
+-- -- Always call `let_intros` to get rid `let` statements in the goal.
+-- -- This makes the experience for the user much nicer and allows for local
+-- -- definitions in the exercise.
+-- let cmdStx ← `(command|
+-- theorem the_theorem $(level.goal) := by {let_intros; $(⟨level.preamble⟩); $(⟨tacticStx'⟩)} )
+-- Elab.Command.elabCommandTopLevel cmdStx)
+-- cmdCtx cmdStateRef
+-- let postNew := (← tacticCacheNew.get).post
+-- snap.tacticCache.modify fun _ => { pre := postNew, post := {} }
+-- let mut postCmdState ← cmdStateRef.get
+-- if !output.isEmpty then
+-- postCmdState := {
+-- postCmdState with
+-- messages := postCmdState.messages.add {
+-- fileName := inputCtx.fileName
+-- severity := MessageSeverity.information
+-- pos := inputCtx.fileMap.toPosition snap.endPos
+-- data := output
+-- }
+-- }
+
+-- let (tacticStx, cmdParserState) ← parseResultRef.get
+-- if tacticStx.isMissing then throwServerError "Tactic execution went wrong. No stx found."
+
+-- let postCmdSnap : Snapshot := {
+-- -- beginPos := tacticStx.getPos?.getD 0
+-- stx := tacticStx
+-- mpState := cmdParserState
+-- cmdState := postCmdState
+-- -- interactiveDiags := ← withNewInteractiveDiags postCmdState.messages
+-- -- tacticCache := (← IO.mkRef {})
+-- }
+-- return postCmdSnap
+
+-- where
+-- /-- Compute the current interactive diagnostics log by finding a "diff" relative to the parent
+-- snapshot. We need to do this because unlike the `MessageLog` itself, interactive diags are not
+-- part of the command state. -/
+-- withNewInteractiveDiags (msgLog : MessageLog) : IO (PersistentArray Widget.InteractiveDiagnostic) := do
+-- let newMsgCount := msgLog.msgs.size - snap.msgLog.msgs.size
+-- let mut ret := snap.interactiveDiags
+-- for i in List.iota newMsgCount do
+-- let newMsg := msgLog.msgs.get! (msgLog.msgs.size - i)
+-- ret := ret.push (← Widget.msgToInteractiveDiagnostic inputCtx.fileMap newMsg hasWidgets)
+-- return ret
+
+-- private def publishIleanInfo (method : String) (m : DocumentMeta) (hOut : FS.Stream)
+-- (snaps : Array Snapshot) : IO Unit := do
+-- let trees := snaps.map fun snap => snap.infoTree
+-- let references ← findModuleRefs m.text trees (localVars := true) |>.toLspModuleRefs
+-- let param := { version := m.version, references : LeanIleanInfoParams }
+-- hOut.writeLspNotification { method, param }
+
+-- private def publishIleanInfoUpdate : DocumentMeta → FS.Stream → Array Snapshot → IO Unit :=
+-- publishIleanInfo "$/lean/ileanInfoUpdate"
+
+-- private def publishIleanInfoFinal : DocumentMeta → FS.Stream → Array Snapshot → IO Unit :=
+-- publishIleanInfo "$/lean/ileanInfoFinal"
+
+-- structure GameCompletedParams where
+-- uri : String
+-- deriving ToJson, FromJson
+
+-- structure GameDiagnostics where
+-- diagnostics : List Diagnostic
+-- deriving ToJson, FromJson
+
+-- structure GameParams where
+-- uri : String
+-- diagnostics : GameDiagnostics
+-- deriving ToJson, FromJson
+
+-- -- `snap` and `initParams` are unused
+-- set_option linter.unusedVariables false in
+
+-- /-- WIP: publish diagnostics, all intermediate goals and if the game is completed. -/
+-- def publishProofState (m : DocumentMeta) (snap : Snapshot) (initParams : Lsp.InitializeParams) (hOut : FS.Stream) :
+-- IO Unit := do
+-- -- let text := m.text
+
+-- -- -- `snap` is the one snapshot containing the entire proof.
+-- -- let mut goals : Array <| InteractiveGoalsWithHints := #[]
+-- -- for pos in text.positions do
+-- -- let source := text.getLineBefore pos
+-- -- -- iterate over all newlines in the proof and get the goals and hints at each position
+-- -- if let goalsAtResult@(_ :: _) := snap.infoTree.goalsAt? text pos then
+-- -- pure ()
+-- -- let goalAtPos : List <| List InteractiveGoalWithHints ← goalsAtResult.mapM
+-- -- fun { ctxInfo := ci, tacticInfo := tacticInfo, useAfter := useAfter, .. } => do
+-- -- -- TODO: What does this function body do?
+-- -- -- let ciAfter := { ci with mctx := ti.mctxAfter }
+-- -- let ci := if useAfter then
+-- -- { ci with mctx := tacticInfo.mctxAfter }
+-- -- else
+-- -- { ci with mctx := tacticInfo.mctxBefore }
+-- -- -- compute the interactive goals
+-- -- let goalMvars : List MVarId ← ci.runMetaM {} do
+-- -- return if useAfter then tacticInfo.goalsAfter else tacticInfo.goalsBefore
+
+-- -- let interactiveGoals : List InteractiveGoalWithHints ← ci.runMetaM {} do
+-- -- goalMvars.mapM fun goal => do
+-- -- let hints ← findHints goal m initParams
+-- -- let interactiveGoal ← goalToInteractive goal
+-- -- return ⟨interactiveGoal, hints⟩
+-- -- -- TODO: This code is way old, can it be deleted?
+-- -- -- compute the goal diff
+-- -- -- let goals ← ciAfter.runMetaM {} (do
+-- -- -- try
+-- -- -- Widget.diffInteractiveGoals useAfter ti goals
+-- -- -- catch _ =>
+-- -- -- -- fail silently, since this is just a bonus feature
+-- -- -- return goals
+-- -- -- )
+-- -- return interactiveGoals
+-- -- let goalAtPos : Array InteractiveGoalWithHints := ⟨goalAtPos.foldl (· ++ ·) []⟩
+-- -- goals := goals.push ⟨goalAtPos, source⟩
+-- -- else
+-- -- -- No goals present
+-- -- goals := goals.push default
+
+-- -- -- Question: Is there a difference between the diags of this snap and the last snap?
+-- -- -- Should we get the diags from there?
+-- -- let diag : Array Widget.InteractiveDiagnostic := snap.interactiveDiags.toArray
+
+-- -- -- Level is completed if there are no errors or warnings
+-- -- let completed : Bool := ¬ diag.any (fun d =>
+-- -- d.severity? == some .error ∨ d.severity? == some .warning)
+
+-- -- let param : ProofState := {
+-- -- steps := goals,
+-- -- diagnostics := diag,
+-- -- completed := completed }
+
+-- -- TODO
+-- let param := { uri := m.uri : GameCompletedParams}
+
+
+-- hOut.writeLspNotification { method := "$/game/publishProofState", param }
+
+-- /-- Checks whether game level has been completed and sends a notification to the client -/
+-- def publishGameCompleted (m : DocumentMeta) (hOut : FS.Stream) (snaps : Array Snapshot) : IO Unit := do
+-- -- check if there is any error or warning
+-- for snap in snaps do
+-- if snap.diagnostics.any fun d => d.severity? == some .error ∨ d.severity? == some .warning
+-- then return
+-- let param := { uri := m.uri : GameCompletedParams}
+-- hOut.writeLspNotification { method := "$/game/completed", param }
+
+-- /-- copied from `Lean.Server.FileWorker.nextCmdSnap`. -/
+-- -- @[inherit_doc Lean.Server.FileWorker.nextCmdSnap] -- cannot inherit from private
+-- private def nextCmdSnap (ctx : WorkerContext) (m : DocumentMeta) (cancelTk : CancelToken)
+-- (gameWorkerState : WorkerState) (initParams : Lsp.InitializeParams) :
+-- AsyncElabM (Option Snapshot) := do
+-- cancelTk.check
+-- let s ← get
+-- let .some lastSnap := s.snaps.back? | panic! "empty snapshots"
+-- if lastSnap.isAtEnd then
+-- publishDiagnostics m lastSnap.diagnostics.toArray ctx.hOut
+-- publishProgressDone m ctx.hOut
+-- publishIleanInfoFinal m ctx.hOut s.snaps
+-- return none
+-- publishProgressAtPos m lastSnap.endPos ctx.hOut
+
+-- -- (modified part)
+-- -- Make sure that there is at least one snap after the head snap, so that
+-- -- we can see the current goal even on an empty document
+-- let couldBeEndSnap := s.snaps.size > 1
+-- let snap ← compileProof m.mkInputContext lastSnap ctx.clientHasWidgets couldBeEndSnap
+-- gameWorkerState initParams
+
+-- set { s with snaps := s.snaps.push snap }
+-- cancelTk.check
+-- -- publishProofState m snap initParams ctx.hOut
+-- publishDiagnostics m snap.diagnostics.toArray ctx.hOut
+-- publishIleanInfoUpdate m ctx.hOut #[snap]
+-- return some snap
+
+-- -- Copied from `Lean.Server.FileWorker.unfoldCmdSnaps` using our own `nextCmdSnap`.
+-- @[inherit_doc Lean.Server.FileWorker.unfoldCmdSnaps]
+-- def unfoldCmdSnaps (m : DocumentMeta) (snaps : Array Snapshot) (cancelTk : CancelToken)
+-- (startAfterMs : UInt32) (gameWorkerState : WorkerState)
+-- : ReaderT WorkerContext IO (AsyncList ElabTaskError Snapshot) := do
+-- let ctx ← read
+-- let some headerSnap := snaps[0]? | panic! "empty snapshots"
+-- if headerSnap.msgLog.hasErrors then
+-- publishProgressAtPos m headerSnap.beginPos ctx.hOut (kind := LeanFileProgressKind.fatalError)
+-- publishIleanInfoFinal m ctx.hOut #[headerSnap]
+-- return AsyncList.ofList [headerSnap]
+-- else
+-- publishIleanInfoUpdate m ctx.hOut snaps
+-- return AsyncList.ofList snaps.toList ++ AsyncList.delayed (← EIO.asTask (ε := ElabTaskError) (prio := .dedicated) do
+-- IO.sleep startAfterMs
+-- AsyncList.unfoldAsync (nextCmdSnap ctx m cancelTk gameWorkerState ctx.initParams) { snaps })
+
+-- end Elab
+
+-- section Updates
+
+-- open private reportSnapshots from Lean.Server.FileWorker
+
+-- /-- Given the new document, updates editable doc state. -/
+-- def updateDocument (meta : DocumentMeta) : WorkerM Unit := do
+-- -- let s ← get
+-- -- let ctx ← read
+-- -- let oldDoc := (← StateT.lift get).doc
+-- -- oldDoc.cancelTk.set
+-- -- let initHeaderStx := (← StateT.lift get).initHeaderStx
+-- -- let (newHeaderStx, newMpState, _) ← Parser.parseHeader meta.mkInputContext
+-- -- let cancelTk ← CancelToken.new
+-- -- let headSnapTask := oldDoc.cmdSnaps.waitHead?
+-- -- let newSnaps ← if initHeaderStx != newHeaderStx then
+-- -- EIO.asTask (ε := ElabTaskError) (prio := .dedicated) do
+-- -- IO.sleep ctx.initParams.editDelay.toUInt32
+-- -- cancelTk.check
+-- -- IO.Process.exit 2
+-- -- else EIO.mapTask (ε := ElabTaskError) (t := headSnapTask) (prio := .dedicated) fun headSnap?? => do
+-- -- -- There is always at least one snapshot absent exceptions
+-- -- let some headSnap ← MonadExcept.ofExcept headSnap?? | panic! "empty snapshots"
+-- -- let newHeaderSnap := { headSnap with stx := newHeaderStx, mpState := newMpState }
+-- -- let changePos := oldDoc.meta.text.source.firstDiffPos meta.text.source
+-- -- -- Ignore exceptions, we are only interested in the successful snapshots
+-- -- let (cmdSnaps, _) ← oldDoc.cmdSnaps.getFinishedPrefix
+-- -- -- NOTE(WN): we invalidate eagerly as `endPos` consumes input greedily. To re-elaborate only
+-- -- -- when really necessary, we could do a whitespace-aware `Syntax` comparison instead.
+-- -- let mut validSnaps ← pure (cmdSnaps.takeWhile (fun s => s.endPos < changePos))
+-- -- if h : validSnaps.length ≤ 1 then
+-- -- validSnaps := [newHeaderSnap]
+-- -- else
+-- -- /- When at least one valid non-header snap exists, it may happen that a change does not fall
+-- -- within the syntactic range of that last snap but still modifies it by appending tokens.
+-- -- We check for this here. We do not currently handle crazy grammars in which an appended
+-- -- token can merge two or more previous commands into one. To do so would require reparsing
+-- -- the entire file. -/
+-- -- have : validSnaps.length ≥ 2 := Nat.gt_of_not_le h
+-- -- let mut lastSnap := validSnaps.getLast (by subst ·; simp at h)
+-- -- let preLastSnap :=
+-- -- have : 0 < validSnaps.length := Nat.lt_of_lt_of_le (by decide) this
+-- -- have : validSnaps.length - 2 < validSnaps.length := Nat.sub_lt this (by decide)
+-- -- validSnaps[validSnaps.length - 2]
+-- -- let newLastStx ← parseNextCmd meta.mkInputContext preLastSnap
+-- -- if newLastStx != lastSnap.stx then
+-- -- validSnaps := validSnaps.dropLast
+-- -- -- wait for a bit, giving the initial `cancelTk.check` in `nextCmdSnap` time to trigger
+-- -- -- before kicking off any expensive elaboration (TODO: make expensive elaboration cancelable)
+-- -- unfoldCmdSnaps meta validSnaps.toArray cancelTk s ctx
+-- -- (startAfterMs := ctx.initParams.editDelay.toUInt32)
+-- -- StateT.lift <| modify fun st => { st with
+-- -- doc := { meta := newMeta, cmdSnaps := AsyncList.delayed newSnaps, cancelTk }}
+
+-- -- from v4.14
+-- (← StateT.lift get).reporterCancelTk.set
+-- let ctx ← read
+-- let initSnap ← ctx.processor meta.mkInputContext
+-- let doc : EditableDocumentCore := {
+-- meta, initSnap
+-- diagnosticsRef := (← IO.mkRef ∅)
+-- }
+-- let reporterCancelTk ← CancelToken.new
+-- let reporter ← reportSnapshots ctx doc reporterCancelTk
+-- StateT.lift <| modify fun st => { st with doc := { doc with reporter }, reporterCancelTk }
+-- -- we assume version updates are monotonous and that we are on the main thread
+-- ctx.maxDocVersionRef.set meta.version
+-- end Updates
+
+-- section Initialization
+
+-- -- def DocumentMeta.mkInputContext (doc : DocumentMeta) : Parser.InputContext where
+-- -- input := "" -- No header!
+-- -- fileName := (System.Uri.fileUriToPath? doc.uri).getD doc.uri |>.toString
+-- -- fileMap := default
+
+-- -- /-- `gameDir` and `module` were added.
+
+-- -- TODO: In general this resembles little similarity with the
+-- -- original code, and I don't know why...
+-- -- -/
+-- -- -- @[inherit_doc Lean.Server.FileWorker.compileHeader]
+-- -- def compileHeader (m : DocumentMeta) (hOut : FS.Stream) (opts : Options) (hasWidgets : Bool)
+-- -- (gameDir : String) (module : Name):
+-- -- IO (Syntax × Task (Except Error (Snapshot × SearchPath))) := do
+-- -- -- Determine search paths of the game project by running `lake env printenv LEAN_PATH`.
+-- -- let out ← IO.Process.output
+-- -- { cwd := gameDir, cmd := "lake", args := #["env","printenv","LEAN_PATH"] }
+-- -- if out.exitCode != 0 then
+-- -- throwServerError s!"Error while running Lake: {out.stderr}"
+
+-- -- -- Make the paths relative to the current directory
+-- -- let paths : List System.FilePath := System.SearchPath.parse out.stdout.trim
+-- -- let currentDir ← IO.currentDir
+-- -- let paths := paths.map fun p => currentDir / (gameDir : System.FilePath) / p
+
+-- -- -- Set the search path
+-- -- Lean.searchPathRef.set paths
+
+-- -- let env ← importModules' #[{ module := `Init : Import }, { module := module : Import }]
+
+-- -- -- use empty header
+-- -- let (headerStx, headerParserState, msgLog) ← Parser.parseHeader
+-- -- {m.mkInputContext with
+-- -- input := ""
+-- -- fileMap := FileMap.ofString ""}
+-- -- (headerStx, ·) <$> EIO.asTask do
+-- -- let mut srcSearchPath : SearchPath := paths --← initSrcSearchPath (← getBuildDir)
+-- -- let headerEnv := env
+-- -- let mut headerEnv := headerEnv
+-- -- try
+-- -- if let some path := System.Uri.fileUriToPath? m.uri then
+-- -- headerEnv := headerEnv.setMainModule (← moduleNameOfFileName path none)
+-- -- catch _ => pure ()
+-- -- let cmdState := Elab.Command.mkState headerEnv {} opts
+-- -- let cmdState := { cmdState with infoState := {
+-- -- enabled := true
+-- -- trees := #[Elab.InfoTree.context (.commandCtx {
+-- -- env := headerEnv
+-- -- fileMap := m.text
+-- -- ngen := { namePrefix := `_worker }
+-- -- }) (Elab.InfoTree.node
+-- -- (Elab.Info.ofCommandInfo { elaborator := `header, stx := headerStx })
+-- -- (headerStx[1].getArgs.toList.map (fun importStx =>
+-- -- Elab.InfoTree.node (Elab.Info.ofCommandInfo {
+-- -- elaborator := `import
+-- -- stx := importStx
+-- -- }) #[].toPArray'
+-- -- )).toPArray'
+-- -- )].toPArray'
+-- -- }}
+-- -- let headerSnap := {
+-- -- beginPos := 0
+-- -- stx := headerStx
+-- -- mpState := {} -- was `headerParserState`
+-- -- cmdState := cmdState
+-- -- interactiveDiags := ← cmdState.messages.msgs.mapM (Widget.msgToInteractiveDiagnostic m.text · hasWidgets)
+-- -- tacticCache := (← IO.mkRef {})
+-- -- }
+-- -- publishDiagnostics m headerSnap.diagnostics.toArray hOut
+-- -- return (headerSnap, srcSearchPath)
+
+-- open private mkImportClosureNotification reportSnapshots from Lean.Server.FileWorker
+
+-- /-- Copied from `Lean.Server.FileWorker.initializeWorker`. Added `gameDir` and
+-- `gameWorkerState` arguments and use custom `unfoldCmdSnaps`. -/
+-- -- @[inherit_doc Lean.Server.FileWorker.initializeWorker]
+-- def initializeWorker (meta : DocumentMeta) (o e : FS.Stream) (initParams : InitializeParams) (opts : Options)
+-- (gameDir : String) (gameWorkerState : WorkerState)
+-- : IO (WorkerContext × Server.FileWorker.WorkerState) := do
+-- let clientHasWidgets := initParams.initializationOptions?.bind (·.hasWidgets?) |>.getD false
+-- -- let (headerStx, headerTask) ← compileHeader meta o opts (hasWidgets := clientHasWidgets)
+-- -- (gameDir := gameDir) (module := gameWorkerState.levelInfo.module)
+-- -- let cancelTk ← CancelToken.new
+-- let maxDocVersionRef ← IO.mkRef 0
+-- let freshRequestIdRef ← IO.mkRef (0 : Int)
+-- let chanIsProcessing ← IO.Channel.new
+-- let stickyDiagnosticsRef ← IO.mkRef ∅
+-- let chanOut ← mkLspOutputChannel maxDocVersionRef chanIsProcessing
+-- let srcSearchPathPromise ← IO.Promise.new
+
+-- let processor := Language.Lean.process (setupImports meta opts chanOut srcSearchPathPromise)
+-- let processor ← Language.mkIncrementalProcessor processor
+-- let initSnap ← processor meta.mkInputContext
+-- let _ ← IO.mapTask (t := srcSearchPathPromise.result) fun srcSearchPath => do
+-- let importClosure := getImportClosure? initSnap
+-- let importClosure ← importClosure.filterMapM (documentUriFromModule srcSearchPath ·)
+-- chanOut.send <| mkImportClosureNotification importClosure
+-- let ctx := {
+-- chanOut
+-- hLog := e
+-- initParams
+-- processor
+-- clientHasWidgets
+-- maxDocVersionRef
+-- freshRequestIdRef
+-- chanIsProcessing
+-- cmdlineOpts := opts
+-- stickyDiagnosticsRef
+-- }
+-- -- let cmdSnaps ← EIO.mapTask (t := headerTask) (match · with
+-- -- | Except.ok (s, _) => unfoldCmdSnaps meta #[s] cancelTk gameWorkerState ctx (startAfterMs := 0)
+-- -- | Except.error e => throw (e : ElabTaskError))
+-- -- let doc : EditableDocument := { meta, cmdSnaps := AsyncList.delayed cmdSnaps, cancelTk }
+-- let doc : EditableDocumentCore := {
+-- meta, initSnap
+-- diagnosticsRef := (← IO.mkRef ∅)
+-- }
+-- let reporterCancelTk ← CancelToken.new
+-- let reporter ← reportSnapshots ctx doc reporterCancelTk
+-- -- return (ctx, {
+-- -- doc := doc
+-- -- initHeaderStx := headerStx
+-- -- currHeaderStx := headerStx
+-- -- importCachingTask? := none
+-- -- pendingRequests := RBMap.empty
+-- -- rpcSessions := RBMap.empty
+-- -- })
+-- return (ctx, {
+-- doc := { doc with reporter }
+-- reporterCancelTk
+-- srcSearchPathTask := srcSearchPathPromise.result
+-- pendingRequests := RBMap.empty
+-- rpcSessions := RBMap.empty
+-- importCachingTask? := none
+-- })
+-- where
+-- /-- Creates an LSP message output channel along with a reader that sends out read messages on
+-- the output FS stream after discarding outdated notifications. This is the only component of
+-- the worker with access to the output stream, so we can synchronize messages from parallel
+-- elaboration tasks here. -/
+-- mkLspOutputChannel maxDocVersion chanIsProcessing : IO (IO.Channel JsonRpc.Message) := do
+-- let chanOut ← IO.Channel.new
+-- let _ ← chanOut.forAsync (prio := .dedicated) fun msg => do
+-- -- discard outdated notifications; note that in contrast to responses, notifications can
+-- -- always be silently discarded
+-- let version? : Option Int := do match msg with
+-- | .notification "textDocument/publishDiagnostics" (some params) =>
+-- let params : PublishDiagnosticsParams ← fromJson? (toJson params) |>.toOption
+-- params.version?
+-- | .notification "$/lean/fileProgress" (some params) =>
+-- let params : LeanFileProgressParams ← fromJson? (toJson params) |>.toOption
+-- params.textDocument.version?
+-- | _ => none
+-- if let some version := version? then
+-- if version < (← maxDocVersion.get) then
+-- return
+-- -- note that because of `server.reportDelayMs`, we cannot simply set `maxDocVersion` here
+-- -- as that would allow outdated messages to be reported until the delay is over
+-- o.writeLspMessage msg |>.catchExceptions (fun _ => pure ())
+-- if let .notification "$/lean/fileProgress" (some params) := msg then
+-- if let some (params : LeanFileProgressParams) := fromJson? (toJson params) |>.toOption then
+-- chanIsProcessing.send (! params.processing.isEmpty)
+-- return chanOut
+
+-- getImportClosure? (snap : Language.Lean.InitialSnapshot) : Array Name := Id.run do
+-- let some snap := snap.result?
+-- | return #[]
+-- let some snap ← snap.processedSnap.get.result?
+-- | return #[]
+-- let importClosure := snap.cmdState.env.allImportedModuleNames
+-- return importClosure
+
+-- end Initialization
+
+-- section NotificationHandling
+
+-- /-- Copied from `Lean.Server.FileWorker.handleDidChange` but with our custom `WorkerM` and
+-- `updateDocument` -/
+-- -- @[inherit_doc Lean.Server.FileWorker.handleDidChange]
+-- def handleDidChange (p : DidChangeTextDocumentParams) : WorkerM Unit := do
+-- let docId := p.textDocument
+-- let changes := p.contentChanges
+-- let oldDoc := (← StateT.lift get).doc
+-- let newVersion := docId.version?.getD 0
+-- if ¬ changes.isEmpty then
+-- let newDocText := foldDocumentChanges changes oldDoc.meta.text
+-- -- modification: set the `DependencyBuildMode` from
+-- -- `oldDoc.meta.dependencyBuildMode` to `.always`
+-- updateDocument ⟨docId.uri, newVersion, newDocText, .always⟩
+
+-- end NotificationHandling
+
+-- section MessageHandling
+
+-- /--
+-- Modified notification handler.
+
+-- Compare to `Lean.Server.FileWorker.handleNotification`.
+-- We use the modified `WorkerM` and use our custom `handleDidChange`.
+-- -/
+-- def handleNotification (method : String) (params : Json) : WorkerM Unit := do
+-- let handle := fun paramType [FromJson paramType] (handler : paramType → WorkerM Unit) =>
+-- (StateT.lift <| parseParams paramType params) >>= handler
+-- match method with
+-- -- modified `textDocument/didChange`, using a custom `handleDidChange`
+-- | "textDocument/didChange" => handle DidChangeTextDocumentParams (handleDidChange)
+-- -- unmodified
+-- | "$/cancelRequest" => handle CancelParams (handleCancelRequest ·)
+-- | "$/lean/staleDependency" => handle Lsp.LeanStaleDependencyParams (handleStaleDependency ·)
+-- | "$/lean/rpc/release" => handle RpcReleaseParams (handleRpcRelease ·)
+-- | "$/lean/rpc/keepAlive" => handle RpcKeepAliveParams (handleRpcKeepAlive ·)
+-- | _ => throwServerError s!"Got unsupported notification method: {method}"
+
+-- end MessageHandling
+
+-- section MainLoop
+
+-- variable (hIn : FS.Stream) in
+-- /--
+-- The main-loop. Copied from `Lean.Server.FileWorker.mainLoop`. Use custom `WorkerM` as well
+-- as custom `handleNotification`.
+-- -/
+-- --@[inherit_doc Lean.Server.FileWorker.mainLoop]
+-- partial def mainLoop : WorkerM Unit := do
+-- -- let ctx ← read
+-- let mut st ← StateT.lift get
+-- let msg ← hIn.readLspMessage
+-- let filterFinishedTasks (acc : PendingRequestMap) (id : RequestID) (task : Task (Except IO.Error Unit))
+-- : IO PendingRequestMap := do
+-- if (← hasFinished task) then
+-- if let Except.error e := task.get then
+-- throwServerError s!"Failed responding to request {id}: {e}"
+-- pure <| acc.erase id
+-- else pure acc
+-- let pendingRequests ← st.pendingRequests.foldM (fun acc id task => filterFinishedTasks acc id task) st.pendingRequests
+-- st := { st with pendingRequests }
+-- for (id, seshRef) in st.rpcSessions do
+-- let sesh ← seshRef.get
+-- if (← sesh.hasExpired) then
+-- st := { st with rpcSessions := st.rpcSessions.erase id }
+-- set st
+-- match msg with
+-- | Message.request id method (some params) =>
+-- handleRequest id method (toJson params)
+-- mainLoop
+-- | Message.notification "exit" none =>
+-- return
+-- | Message.notification method (some params) =>
+-- handleNotification method (toJson params) -- modified function used
+-- mainLoop
+-- | Message.response id result =>
+-- handleResponse id result
+-- mainLoop
+-- | Message.responseError .. =>
+-- mainLoop
+-- | _ => throwServerError s!"Got invalid JSON-RPC message: {toJson msg}"
+
+-- end MainLoop
+
+-- def getGameWorkerState (gameDir : String) (initParams : Request Game.InitializeParams) (meta : DocumentMeta) : IO WorkerState := do
+
+-- let game ← loadGameData gameDir
+-- -- TODO: We misuse the `rootUri` field to the gameName
+-- let rootUri? : Option String := some (toString game.name)
+-- let initParams' := {initParams.param.toLeanInternal with rootUri?}
+-- let some (levelId : LevelId) := GameServer.levelIdFromFileName?
+-- initParams' meta.mkInputContext.fileName
+-- | throwServerError s!"Could not determine level ID: {meta.mkInputContext.fileName}"
+-- let levelInfo ← loadLevelData gameDir levelId.world levelId.level
+-- let some initializationOptions := initParams.param.initializationOptions?
+-- | throwServerError "no initialization options found"
+-- let gameWorkerState : WorkerState := {
+-- inventory := initializationOptions.inventory
+-- difficulty := initializationOptions.difficulty
+-- levelInfo
+-- }
+-- return gameWorkerState
+
+-- /-- Modified from `Lean.Server.FileWorker.initAndRunWorker`.
+-- Added `gameDir` argument, -/
+-- -- @[inherit_doc Lean.Server.FileWorker.initAndRunWorker]
+-- def initAndRunWorker (i o e : FS.Stream) (opts : Options) (gameDir : String) : IO Unit := do
+-- let i ← maybeTee "fwIn.txt" false i
+-- let o ← maybeTee "fwOut.txt" true o
+-- let initParams ← i.readLspRequestAs "initialize" Game.InitializeParams
+
+-- -- BIG MODIFICATION
+-- o.writeLspResponse {
+-- id := initParams.id
+-- result := {
+-- capabilities := Watchdog.mkLeanServerCapabilities
+-- serverInfo? := some {
+-- name := "Lean 4 Game Server"
+-- version? := "0.1.1"
+-- }
+-- : InitializeResult
+-- }
+-- }
+-- discard $ i.readLspNotificationAs "initialized" InitializedParams
+
+-- let ⟨_, param⟩ ← i.readLspNotificationAs "textDocument/didOpen" DidOpenTextDocumentParams
+-- let doc := param.textDocument
+-- let meta : DocumentMeta := ⟨doc.uri, doc.version, doc.text.crlfToLf.toFileMap, .always⟩ -- modification: using `.always`
+-- let e := e.withPrefix s!"[{param.textDocument.uri}] "
+-- let _ ← IO.setStderr e
+-- try
+
+-- -- BIG MODIFICATION
+-- let game ← loadGameData gameDir
+-- -- TODO: We misuse the `rootUri` field to the gameName
+-- let rootUri? : Option String := some (toString game.name)
+-- let initParams := {initRequest.param.toLeanInternal with rootUri?}
+-- let some (levelId : LevelId) := GameServer.levelIdFromFileName?
+-- initParams meta.mkInputContext.fileName
+-- | throwServerError s!"Could not determine level ID: {meta.mkInputContext.fileName}"
+-- let levelInfo ← loadLevelData gameDir levelId.world levelId.level
+
+-- -- TODO: I don't know how to pass these options to the Lean server
+-- -- with the new lean4monaco setup!!
+-- -- let some initializationOptions := initRequest.param.initializationOptions?
+-- -- | throwServerError "no initialization options found"
+-- let initializationOptions : Game.InitializationOptions := {
+-- difficulty := 1
+-- inventory := #[]
+-- editDelay? := none
+-- hasWidgets? := none
+-- }
+
+-- let gameWorkerState : WorkerState := {
+-- inventory := initializationOptions.inventory
+-- difficulty := initializationOptions.difficulty
+-- levelInfo
+-- }
+-- let (ctx, st) ← initializeWorker meta i o e initParams opts gameDir gameWorkerState
+-- -- Run the main loop
+-- let _ ← StateRefT'.run (s := st) <| ReaderT.run (r := ctx) <|
+-- StateT.run (s := gameWorkerState) <| (mainLoop)
+
+
+-- return (0 : UInt32)
+-- catch e =>
+-- IO.eprintln e
+-- publishDiagnostics meta #[{
+-- range := ⟨⟨0, 0⟩, ⟨0, 0⟩⟩,
+-- severity? := DiagnosticSeverity.error,
+-- message := e.toString }] o
+-- return (1 : UInt32)
+
+/--
+The main function. Simply wrapping `initAndRunWorker`.
+
+Copied from `Lean.Server.FileWorker.workerMain`. We add `args` as an argument to pass on
+the `gameDir`.
+
+TODO: The first arg `args[0]` is always expected to be `--server`. We could drop this completely.
+-/
+-- @[inherit_doc Lean.Server.FileWorker.workerMain]
+def workerMain (opts : Options) (args : List String) : IO UInt32 := do
+ IO.Process.exit 1
+-- let i ← IO.getStdin
+-- let o ← IO.getStdout
+-- let e ← IO.getStderr
+-- try
+-- let some gameDir := args[1]? | throwServerError "Expected second argument: gameDir"
+-- initAndRunWorker i o e opts gameDir
+-- o.flush
+-- e.flush
+-- IO.Process.exit 0
+-- catch err =>
+-- e.putStrLn s!"worker initialization error: {err}"
+-- IO.Process.exit 1
+
+-- end GameServer.FileWorker
diff --git a/server/GameServerExe/FileWorkerNew.lean b/server/GameServerExe/FileWorkerNew.lean
new file mode 100644
index 00000000..14d187a4
--- /dev/null
+++ b/server/GameServerExe/FileWorkerNew.lean
@@ -0,0 +1,822 @@
+/- This file is adapted from `Lean/Server/FileWorker.lean`. -/
+import Lean.Server.FileWorker
+import GameServerExe.Game
+import GameServerExe.ImportModules
+import GameServer.SaveData
+import GameServer.EnvExtensions
+import GameServer.Tactic.LetIntros
+import GameServerExe.Tmp
+
+/-!
+For general server architecture, see `README.md`. For details of IPC communication, see `Watchdog.lean`.
+This module implements per-file worker processes.
+
+File processing and requests+notifications against a file should be concurrent for two reasons:
+- By the LSP standard, requests should be cancellable.
+- Since Lean allows arbitrary user code to be executed during elaboration via the tactic framework,
+ elaboration can be extremely slow and even not halt in some cases. Users should be able to
+ work with the file while this is happening, e.g. make new changes to the file or send requests.
+
+To achieve these goals, elaboration is executed in a chain of tasks, where each task corresponds to
+the elaboration of one command. When the elaboration of one command is done, the next task is spawned.
+On didChange notifications, we search for the task in which the change occurred. If we stumble across
+a task that has not yet finished before finding the task we're looking for, we terminate it
+and start the elaboration there, otherwise we start the elaboration at the task where the change occurred.
+
+Requests iterate over tasks until they find the command that they need to answer the request.
+In order to not block the main thread, this is done in a request task.
+If a task that the request task waits for is terminated, a change occurred somewhere before the
+command that the request is looking for and the request sends a "content changed" error.
+-/
+
+namespace GameServer.FileWorker
+
+open Lean Server FileWorker
+open Lsp
+open IO
+open Snapshots
+open JsonRpc
+
+-- open Widget in
+
+-- structure WorkerContext where
+-- /-- Synchronized output channel for LSP messages. Notifications for outdated versions are
+-- discarded on read. -/
+-- chanOut : IO.Channel JsonRpc.Message
+-- /--
+-- Latest document version received by the client, used for filtering out notifications from
+-- previous versions.
+-- -/
+-- maxDocVersionRef : IO.Ref Int
+-- freshRequestIdRef : IO.Ref Int
+-- /--
+-- Channel that receives a message for every a `$/lean/fileProgress` notification, indicating whether
+-- the notification suggests that the file is currently being processed.
+-- -/
+-- chanIsProcessing : IO.Channel Bool
+-- /--
+-- Diagnostics that are included in every single `textDocument/publishDiagnostics` notification.
+-- -/
+-- stickyDiagnosticsRef : IO.Ref (Array InteractiveDiagnostic)
+-- hLog : FS.Stream
+-- initParams : InitializeParams
+-- processor : Parser.InputContext → BaseIO Lean.Language.Lean.InitialSnapshot
+-- clientHasWidgets : Bool
+-- /--
+-- Options defined on the worker cmdline (i.e. not including options from `setup-file`), used for
+-- context-free tasks such as editing delay.
+-- -/
+-- cmdlineOpts : Options
+
+-- /-! # Asynchronous snapshot elaboration -/
+
+-- section Elab
+-- -- Placed here instead of Lean.Server.Utils because of an import loop
+-- private def mkIleanInfoNotification (method : String) (m : DocumentMeta)
+-- (trees : Array Elab.InfoTree) : BaseIO (JsonRpc.Notification Lsp.LeanIleanInfoParams) := do
+-- let references ← findModuleRefs m.text trees (localVars := true) |>.toLspModuleRefs
+-- let param := { version := m.version, references }
+-- return { method, param }
+
+-- private def mkIleanInfoUpdateNotification : DocumentMeta → Array Elab.InfoTree →
+-- BaseIO (JsonRpc.Notification Lsp.LeanIleanInfoParams) :=
+-- mkIleanInfoNotification "$/lean/ileanInfoUpdate"
+
+-- private def mkIleanInfoFinalNotification : DocumentMeta → Array Elab.InfoTree →
+-- BaseIO (JsonRpc.Notification Lsp.LeanIleanInfoParams) :=
+-- mkIleanInfoNotification "$/lean/ileanInfoFinal"
+
+-- /-- Yields a `$/lean/importClosure` notification. -/
+-- private def mkImportClosureNotification (importClosure : Array DocumentUri)
+-- : JsonRpc.Notification Lsp.LeanImportClosureParams := {
+-- method := "$/lean/importClosure",
+-- param := { importClosure : LeanImportClosureParams }
+-- }
+
+-- /-- State of `reportSnapshots`. -/
+-- private structure ReportSnapshotsState where
+-- /-- Whether we have waited for a snapshot to finish at least once (see debouncing below). -/
+-- hasBlocked := false
+-- /-- All info trees encountered so far. -/
+-- allInfoTrees : Array Elab.InfoTree := #[]
+-- /-- New info trees encountered since we last sent a .ilean update notification. -/
+-- newInfoTrees : Array Elab.InfoTree := #[]
+-- /-- Whether we encountered any snapshot with `Snapshot.isFatal`. -/
+-- hasFatal := false
+-- /--
+-- Last `Snapshot.range?` encountered that was not `none`, if any. We use this as a fallback when
+-- reporting progress as we should always report *some* range when waiting on a task.
+-- -/
+-- lastRange? : Option String.Range := none
+-- deriving Inhabited
+
+-- register_builtin_option server.reportDelayMs : Nat := {
+-- defValue := 200
+-- group := "server"
+-- descr := "(server) time in milliseconds to wait before reporting progress and diagnostics on \
+-- document edit in order to reduce flickering
+
+-- This option can only be set on the command line, not in the lakefile or via `set_option`."
+-- }
+
+-- /--
+-- Type of state stored in `Snapshot.Diagnostics.cacheRef?`.
+
+-- See also section "Communication" in Lean/Server/README.md.
+-- -/
+-- structure MemorizedInteractiveDiagnostics where
+-- diags : Array Widget.InteractiveDiagnostic
+-- deriving TypeName
+
+-- /--
+-- Sends a `textDocument/publishDiagnostics` notification to the client that contains the diagnostics
+-- in `ctx.stickyDiagnosticsRef` and `doc.diagnosticsRef`.
+-- -/
+-- private def publishDiagnostics (ctx : WorkerContext) (doc : EditableDocumentCore)
+-- : BaseIO Unit := do
+-- let stickyInteractiveDiagnostics ← ctx.stickyDiagnosticsRef.get
+-- let docInteractiveDiagnostics ← doc.diagnosticsRef.get
+-- let diagnostics :=
+-- stickyInteractiveDiagnostics ++ docInteractiveDiagnostics
+-- |>.map (·.toDiagnostic)
+-- let notification := mkPublishDiagnosticsNotification doc.meta diagnostics
+-- ctx.chanOut.send notification
+
+-- open Language in
+-- /--
+-- Reports status of a snapshot tree incrementally to the user: progress,
+-- diagnostics, .ilean reference information.
+
+-- See also section "Communication" in Lean/Server/README.md.
+
+-- Debouncing: we only report information
+-- * after first waiting for `reportDelayMs`, to give trivial tasks a chance to finish
+-- * when first blocking, i.e. not before skipping over any unchanged snapshots and such trivial
+-- tasks
+-- * afterwards, each time new information is found in a snapshot
+-- * at the very end, if we never blocked (e.g. emptying a file should make
+-- sure to empty diagnostics as well eventually) -/
+-- private partial def reportSnapshots (ctx : WorkerContext) (doc : EditableDocumentCore)
+-- (cancelTk : CancelToken) : BaseIO (Task Unit) := do
+-- let t ← BaseIO.asTask do
+-- IO.sleep (server.reportDelayMs.get ctx.cmdlineOpts).toUInt32
+-- BaseIO.bindTask t fun _ => do
+-- BaseIO.bindTask (← go (toSnapshotTree doc.initSnap) {}) fun st => do
+-- if (← cancelTk.isSet) then
+-- return .pure ()
+
+-- -- callback at the end of reporting
+-- if st.hasFatal then
+-- ctx.chanOut.send <| mkFileProgressAtPosNotification doc.meta 0 .fatalError
+-- else
+-- ctx.chanOut.send <| mkFileProgressDoneNotification doc.meta
+-- unless st.hasBlocked do
+-- publishDiagnostics ctx doc
+-- -- This will overwrite existing ilean info for the file, in case something
+-- -- went wrong during the incremental updates.
+-- ctx.chanOut.send (← mkIleanInfoFinalNotification doc.meta st.allInfoTrees)
+-- return .pure ()
+-- where
+-- go (node : SnapshotTree) (st : ReportSnapshotsState) : BaseIO (Task ReportSnapshotsState) := do
+-- if node.element.diagnostics.msgLog.hasUnreported then
+-- let diags ←
+-- if let some memorized ← node.element.diagnostics.interactiveDiagsRef?.bindM fun ref => do
+-- return (← ref.get).bind (·.get? MemorizedInteractiveDiagnostics) then
+-- pure memorized.diags
+-- else
+-- let diags ← node.element.diagnostics.msgLog.toArray.mapM
+-- (Widget.msgToInteractiveDiagnostic doc.meta.text · ctx.clientHasWidgets)
+-- if let some cacheRef := node.element.diagnostics.interactiveDiagsRef? then
+-- cacheRef.set <| some <| .mk { diags : MemorizedInteractiveDiagnostics }
+-- pure diags
+-- doc.diagnosticsRef.modify (· ++ diags)
+-- if st.hasBlocked then
+-- publishDiagnostics ctx doc
+
+-- let mut st := { st with hasFatal := st.hasFatal || node.element.isFatal }
+
+-- if let some itree := node.element.infoTree? then
+-- let mut newInfoTrees := st.newInfoTrees.push itree
+-- if st.hasBlocked then
+-- ctx.chanOut.send (← mkIleanInfoUpdateNotification doc.meta newInfoTrees)
+-- newInfoTrees := #[]
+-- st := { st with newInfoTrees, allInfoTrees := st.allInfoTrees.push itree }
+
+-- goSeq st node.children.toList
+
+-- goSeq (st : ReportSnapshotsState) :
+-- List (SnapshotTask SnapshotTree) → BaseIO (Task ReportSnapshotsState)
+-- | [] => return .pure st
+-- | t::ts => do
+-- let mut st := st
+-- st := { st with lastRange? := t.range? <|> st.lastRange? }
+-- unless (← IO.hasFinished t.task) do
+-- -- report *some* recent range even if `t.range?` is `none`; see also `State.lastRange?`
+-- if let some range := st.lastRange? then
+-- ctx.chanOut.send <| mkFileProgressAtPosNotification doc.meta range.start
+-- if !st.hasBlocked then
+-- publishDiagnostics ctx doc
+-- st := { st with hasBlocked := true }
+-- BaseIO.bindTask t.task fun t => do
+-- BaseIO.bindTask (← go t st) (goSeq · ts)
+-- end Elab
+
+-- -- Pending requests are tracked so they can be canceled
+-- abbrev PendingRequestMap := RBMap RequestID (Task (Except IO.Error Unit)) compare
+
+-- structure AvailableImportsCache where
+-- availableImports : ImportCompletion.AvailableImports
+-- lastRequestTimestampMs : Nat
+
+/--
+Game-specific state to be packed on top of the `Server.FileWorker.WorkerState`
+used by the Lean server.
+-/
+structure WorkerState where
+ /--
+ Collection of items which are considered unlocked.
+ Tactics and theorems are mixed together.
+ -/
+ inventory : Array String
+ /--
+ Difficulty determines whether tactics/theorems can be locked.
+ * 0: do not check
+ * 1: give warnings when locked items are used
+ * 2: give errors when locked items are used
+ -/
+ difficulty : Nat
+ /--
+ `levelInfo` contains all the (static) information about the level which is not influenced
+ by the user's progress.
+ -/
+ levelInfo : LevelInfo
+deriving ToJson, FromJson
+
+/--
+Pack the our custom `WorkerState` on top of the normal worker monad
+`Server.FileWorker.WorkerM`.
+-/
+abbrev WorkerM := StateT WorkerState Server.FileWorker.WorkerM
+
+/-- TODO: this is written newly, I think -/
+def getGameWorkerState (gameDir : String) (initParams : Request Game.InitializeParams) (meta : DocumentMeta) : IO WorkerState := do
+
+ let game ← loadGameData gameDir
+ -- TODO: We misuse the `rootUri` field to the gameName
+ let rootUri? : Option String := some (toString game.name)
+ let initParams' := {initParams.param.toLeanInternal with rootUri?}
+ let some (levelId : LevelId) := GameServer.levelIdFromFileName?
+ initParams' meta.mkInputContext.fileName
+ | throwServerError s!"Could not determine level ID: {meta.mkInputContext.fileName}"
+ let levelInfo ← loadLevelData gameDir levelId.world levelId.level
+ let some initializationOptions := initParams.param.initializationOptions?
+ | throwServerError "no initialization options found"
+ let gameWorkerState : WorkerState := {
+ inventory := initializationOptions.inventory
+ difficulty := initializationOptions.difficulty
+ levelInfo
+ }
+ return gameWorkerState
+
+/-- Makes sure we load imports at most once per process as they cannot be unloaded. -/
+private builtin_initialize importsLoadedRef : IO.Ref Bool ← IO.mkRef false
+
+open Language Lean in
+/--
+Callback from Lean language processor after parsing imports that requests necessary information from
+Lake for processing imports.
+-/
+def setupImports (meta : DocumentMeta) (cmdlineOpts : Options) (chanOut : Channel JsonRpc.Message)
+ (srcSearchPathPromise : Promise SearchPath) (stx : Syntax) :
+ Language.ProcessingT IO (Except Language.Lean.HeaderProcessedSnapshot SetupImportsResult) := do
+ let importsAlreadyLoaded ← importsLoadedRef.modifyGet ((·, true))
+ if importsAlreadyLoaded then
+ -- As we never unload imports in the server, we should not run the code below twice in the
+ -- same process and instead ask the watchdog to restart the worker
+ IO.sleep 200 -- give user time to make further edits before restart
+ unless (← IO.checkCanceled) do
+ IO.Process.exit 2 -- signal restart request to watchdog
+ -- should not be visible to user as task is already canceled
+ return .error { diagnostics := .empty, result? := none }
+
+ let imports := Elab.headerToImports stx
+ let fileSetupResult ← setupFile meta imports fun stderrLine => do
+ let progressDiagnostic := {
+ range := ⟨⟨0, 0⟩, ⟨1, 0⟩⟩
+ -- make progress visible anywhere in the file
+ fullRange? := some ⟨⟨0, 0⟩, meta.text.utf8PosToLspPos meta.text.source.endPos⟩
+ severity? := DiagnosticSeverity.information
+ message := stderrLine
+ }
+ chanOut.send <| mkPublishDiagnosticsNotification meta #[progressDiagnostic]
+ -- clear progress notifications in the end
+ chanOut.send <| mkPublishDiagnosticsNotification meta #[]
+ match fileSetupResult.kind with
+ | .importsOutOfDate =>
+ return .error {
+ diagnostics := (← Language.diagnosticsOfHeaderError
+ "Imports are out of date and must be rebuilt; \
+ use the \"Restart File\" command in your editor.")
+ result? := none
+ }
+ | .error msg =>
+ return .error {
+ diagnostics := (← diagnosticsOfHeaderError msg)
+ result? := none
+ }
+ | _ => pure ()
+
+ srcSearchPathPromise.resolve fileSetupResult.srcSearchPath
+
+ let mainModuleName ← if let some path := System.Uri.fileUriToPath? meta.uri then
+ EIO.catchExceptions (h := fun _ => pure Name.anonymous) do
+ if let some mod ← searchModuleNameOfFileName path fileSetupResult.srcSearchPath then
+ pure mod
+ else
+ moduleNameOfFileName path none
+ else
+ pure Name.anonymous
+
+ -- override cmdline options with file options
+ let opts := cmdlineOpts.mergeBy (fun _ _ fileOpt => fileOpt) fileSetupResult.fileOptions
+
+ return .ok {
+ mainModuleName
+ opts
+ }
+
+/- Worker initialization sequence. -/
+section Initialization
+ open private mkImportClosureNotification reportSnapshots from Lean.Server.FileWorker
+
+ def initializeWorker (meta : DocumentMeta) (o e : FS.Stream) (initParams : InitializeParams) (opts : Options) (gameDir : String) (gameWorkerState : WorkerState)
+ : IO (WorkerContext × Server.FileWorker.WorkerState) := do
+ let clientHasWidgets := initParams.initializationOptions?.bind (·.hasWidgets?) |>.getD false
+ let maxDocVersionRef ← IO.mkRef 0
+ let freshRequestIdRef ← IO.mkRef (0 : Int)
+ let chanIsProcessing ← IO.Channel.new
+ let stickyDiagnosticsRef ← IO.mkRef ∅
+ let chanOut ← mkLspOutputChannel maxDocVersionRef chanIsProcessing
+ let srcSearchPathPromise ← IO.Promise.new
+
+ let processor := Language.Lean.process (setupImports meta opts chanOut srcSearchPathPromise)
+ let processor ← Language.mkIncrementalProcessor processor
+ let initSnap ← processor meta.mkInputContext
+ let _ ← IO.mapTask (t := srcSearchPathPromise.result) fun srcSearchPath => do
+ let importClosure := getImportClosure? initSnap
+ let importClosure ← importClosure.filterMapM (documentUriFromModule srcSearchPath ·)
+ chanOut.send <| mkImportClosureNotification importClosure
+ let ctx := {
+ chanOut
+ hLog := e
+ initParams
+ processor
+ clientHasWidgets
+ maxDocVersionRef
+ freshRequestIdRef
+ chanIsProcessing
+ cmdlineOpts := opts
+ stickyDiagnosticsRef
+ }
+ let doc : EditableDocumentCore := {
+ meta, initSnap
+ diagnosticsRef := (← IO.mkRef ∅)
+ }
+ let reporterCancelTk ← CancelToken.new
+ let reporter ← reportSnapshots ctx doc reporterCancelTk
+ return (ctx, {
+ doc := { doc with reporter }
+ reporterCancelTk
+ srcSearchPathTask := srcSearchPathPromise.result
+ pendingRequests := RBMap.empty
+ rpcSessions := RBMap.empty
+ importCachingTask? := none
+ })
+ where
+ /-- Creates an LSP message output channel along with a reader that sends out read messages on
+ the output FS stream after discarding outdated notifications. This is the only component of
+ the worker with access to the output stream, so we can synchronize messages from parallel
+ elaboration tasks here. -/
+ mkLspOutputChannel maxDocVersion chanIsProcessing : IO (IO.Channel JsonRpc.Message) := do
+ let chanOut ← IO.Channel.new
+ let _ ← chanOut.forAsync (prio := .dedicated) fun msg => do
+ -- discard outdated notifications; note that in contrast to responses, notifications can
+ -- always be silently discarded
+ let version? : Option Int := do match msg with
+ | .notification "textDocument/publishDiagnostics" (some params) =>
+ let params : PublishDiagnosticsParams ← fromJson? (toJson params) |>.toOption
+ params.version?
+ | .notification "$/lean/fileProgress" (some params) =>
+ let params : LeanFileProgressParams ← fromJson? (toJson params) |>.toOption
+ params.textDocument.version?
+ | _ => none
+ if let some version := version? then
+ if version < (← maxDocVersion.get) then
+ return
+ -- note that because of `server.reportDelayMs`, we cannot simply set `maxDocVersion` here
+ -- as that would allow outdated messages to be reported until the delay is over
+ o.writeLspMessage msg |>.catchExceptions (fun _ => pure ())
+ if let .notification "$/lean/fileProgress" (some params) := msg then
+ if let some (params : LeanFileProgressParams) := fromJson? (toJson params) |>.toOption then
+ chanIsProcessing.send (! params.processing.isEmpty)
+ return chanOut
+
+ getImportClosure? (snap : Language.Lean.InitialSnapshot) : Array Name := Id.run do
+ let some snap := snap.result?
+ | return #[]
+ let some snap ← snap.processedSnap.get.result?
+ | return #[]
+ let importClosure := snap.cmdState.env.allImportedModuleNames
+ return importClosure
+
+end Initialization
+
+-- section ServerRequests
+-- def sendServerRequest [ToJson α]
+-- (ctx : WorkerContext)
+-- (method : String)
+-- (param : α)
+-- : IO Unit := do
+-- let freshRequestId ← ctx.freshRequestIdRef.modifyGet fun freshRequestId =>
+-- (freshRequestId, freshRequestId + 1)
+-- let r : JsonRpc.Request α := ⟨freshRequestId, method, param⟩
+-- ctx.chanOut.send r
+-- end ServerRequests
+
+section Updates
+ -- def updatePendingRequests (map : PendingRequestMap → PendingRequestMap) : WorkerM Unit := do
+ -- modify fun st => { st with pendingRequests := map st.pendingRequests }
+
+ open private reportSnapshots from Lean.Server.FileWorker
+
+ /-- Given the new document, updates editable doc state. -/
+ def updateDocument (meta : DocumentMeta) : WorkerM Unit := do
+ (← StateT.lift get).reporterCancelTk.set
+ let ctx ← read
+ let initSnap ← ctx.processor meta.mkInputContext
+ let doc : EditableDocumentCore := {
+ meta, initSnap
+ diagnosticsRef := (← IO.mkRef ∅)
+ }
+ let reporterCancelTk ← CancelToken.new
+ let reporter ← reportSnapshots ctx doc reporterCancelTk
+ StateT.lift <| modify fun st => { st with doc := { doc with reporter }, reporterCancelTk }
+ -- we assume version updates are monotonous and that we are on the main thread
+ ctx.maxDocVersionRef.set meta.version
+end Updates
+
+/- Notifications are handled in the main thread. They may change global worker state
+such as the current file contents. -/
+section NotificationHandling
+ /-- Copied from `Lean.Server.FileWorker.handleDidChange` but with our custom `WorkerM` and
+ `updateDocument` -/
+ -- @[inherit_doc Lean.Server.FileWorker.handleDidChange]
+ def handleDidChange (p : DidChangeTextDocumentParams) : WorkerM Unit := do
+ let docId := p.textDocument
+ let changes := p.contentChanges
+ let oldDoc := (←StateT.lift get).doc
+ let newVersion := docId.version?.getD 0
+ if ¬ changes.isEmpty then
+ let newDocText := foldDocumentChanges changes oldDoc.meta.text
+ -- modification: set the `DependencyBuildMode` from
+ -- `oldDoc.meta.dependencyBuildMode` to `.always`
+ updateDocument ⟨docId.uri, newVersion, newDocText, .always⟩
+
+-- def handleCancelRequest (p : CancelParams) : WorkerM Unit := do
+-- updatePendingRequests (fun pendingRequests => pendingRequests.erase p.id)
+
+-- /--
+-- Received from the watchdog when a dependency of this file is detected as being stale.
+-- Issues a sticky diagnostic to the client that it should run "Restart File".
+-- -/
+-- def handleStaleDependency (_ : LeanStaleDependencyParams) : WorkerM Unit := do
+-- let ctx ← read
+-- let s ← get
+-- let text := s.doc.meta.text
+-- let importOutOfDataMessage := .text s!"Imports are out of date and should be rebuilt; \
+-- use the \"Restart File\" command in your editor."
+-- let diagnostic := {
+-- range := ⟨⟨0, 0⟩, ⟨1, 0⟩⟩
+-- fullRange? := some ⟨⟨0, 0⟩, text.utf8PosToLspPos text.source.endPos⟩
+-- severity? := DiagnosticSeverity.information
+-- message := importOutOfDataMessage
+-- }
+-- ctx.stickyDiagnosticsRef.modify fun stickyDiagnostics =>
+-- let stickyDiagnostics := stickyDiagnostics.filter
+-- (·.message.stripTags != importOutOfDataMessage.stripTags)
+-- stickyDiagnostics.push diagnostic
+-- publishDiagnostics ctx s.doc.toEditableDocumentCore
+
+-- def handleRpcRelease (p : Lsp.RpcReleaseParams) : WorkerM Unit := do
+-- -- NOTE(WN): when the worker restarts e.g. due to changed imports, we may receive `rpc/release`
+-- -- for the previous RPC session. This is fine, just ignore.
+-- if let some seshRef := (← get).rpcSessions.find? p.sessionId then
+-- let monoMsNow ← IO.monoMsNow
+-- let discardRefs : StateM RpcObjectStore Unit := do
+-- for ref in p.refs do
+-- discard do rpcReleaseRef ref
+-- seshRef.modify fun st =>
+-- let st := st.keptAlive monoMsNow
+-- let ((), objects) := discardRefs st.objects
+-- { st with objects }
+
+-- def handleRpcKeepAlive (p : Lsp.RpcKeepAliveParams) : WorkerM Unit := do
+-- match (← get).rpcSessions.find? p.sessionId with
+-- | none => return
+-- | some seshRef =>
+-- seshRef.modify (·.keptAlive (← IO.monoMsNow))
+
+end NotificationHandling
+
+-- /-! Requests here are handled synchronously rather than in the asynchronous `RequestM`. -/
+-- section RequestHandling
+
+-- def handleRpcConnect (_ : RpcConnectParams) : WorkerM RpcConnected := do
+-- let (newId, newSesh) ← RpcSession.new
+-- let newSeshRef ← IO.mkRef newSesh
+-- modify fun st => { st with rpcSessions := st.rpcSessions.insert newId newSeshRef }
+-- return { sessionId := newId }
+
+-- end RequestHandling
+
+section MessageHandling
+ def parseParams (paramType : Type) [FromJson paramType] (params : Json) : WorkerM paramType :=
+ match fromJson? params with
+ | Except.ok parsed => pure parsed
+ | Except.error inner => throwServerError s!"Got param with wrong structure: {params.compress}\n{inner}"
+
+ /--
+ Modified notification handler.
+
+ Compare to `Lean.Server.FileWorker.handleNotification`.
+ We use the modified `WorkerM` and use our custom `handleDidChange`.
+ -/
+ def handleNotification (method : String) (params : Json) : WorkerM Unit := do
+ let handle := fun paramType [FromJson paramType] (handler : paramType → WorkerM Unit) =>
+ parseParams paramType params >>= handler
+ match method with
+ -- modified `textDocument/didChange`, using a custom `handleDidChange`
+ | "textDocument/didChange" => handle DidChangeTextDocumentParams handleDidChange
+ -- unmodified
+ | "$/cancelRequest" => handle CancelParams (handleCancelRequest ·)
+ | "$/lean/staleDependency" => handle Lsp.LeanStaleDependencyParams (handleStaleDependency ·)
+ | "$/lean/rpc/release" => handle RpcReleaseParams (handleRpcRelease ·)
+ | "$/lean/rpc/keepAlive" => handle RpcKeepAliveParams (handleRpcKeepAlive ·)
+ | _ => throwServerError s!"Got unsupported notification method: {method}"
+
+ -- def queueRequest (id : RequestID) (requestTask : Task (Except IO.Error Unit))
+ -- : WorkerM Unit := do
+ -- updatePendingRequests (fun pendingRequests => pendingRequests.insert id requestTask)
+
+ -- open Widget RequestM Language in
+ -- def handleGetInteractiveDiagnosticsRequest (params : GetInteractiveDiagnosticsParams) :
+ -- WorkerM (Array InteractiveDiagnostic) := do
+ -- let ctx ← read
+ -- let st ← get
+ -- -- NOTE: always uses latest document (which is the only one we can retrieve diagnostics for);
+ -- -- any race should be temporary as the client should re-request interactive diagnostics when
+ -- -- they receive the non-interactive diagnostics for the new document
+ -- let stickyDiags ← ctx.stickyDiagnosticsRef.get
+ -- let diags ← st.doc.diagnosticsRef.get
+ -- -- NOTE: does not wait for `lineRange?` to be fully elaborated, which would be problematic with
+ -- -- fine-grained incremental reporting anyway; instead, the client is obligated to resend the
+ -- -- request when the non-interactive diagnostics of this range have changed
+ -- return (stickyDiags ++ diags).filter fun diag =>
+ -- let r := diag.fullRange
+ -- let diagStartLine := r.start.line
+ -- let diagEndLine :=
+ -- if r.end.character == 0 then
+ -- r.end.line
+ -- else
+ -- r.end.line + 1
+ -- params.lineRange?.all fun ⟨s, e⟩ =>
+ -- -- does [s,e) intersect [diagStartLine,diagEndLine)?
+ -- s ≤ diagStartLine ∧ diagStartLine < e ∨
+ -- diagStartLine ≤ s ∧ s < diagEndLine
+
+ -- def handleImportCompletionRequest (id : RequestID) (params : CompletionParams)
+ -- : WorkerM (Task (Except Error AvailableImportsCache)) := do
+ -- let ctx ← read
+ -- let st ← get
+ -- let text := st.doc.meta.text
+
+ -- match st.importCachingTask? with
+ -- | none => IO.asTask (prio := Task.Priority.dedicated) do
+ -- let availableImports ← ImportCompletion.collectAvailableImports
+ -- let lastRequestTimestampMs ← IO.monoMsNow
+ -- let completions := ImportCompletion.find text st.doc.initSnap.stx params availableImports
+ -- ctx.chanOut.send <| .response id (toJson completions)
+ -- pure { availableImports, lastRequestTimestampMs : AvailableImportsCache }
+
+ -- | some task => IO.mapTask (t := task) fun result => do
+ -- let mut ⟨availableImports, lastRequestTimestampMs⟩ ← IO.ofExcept result
+ -- let timestampNowMs ← IO.monoMsNow
+ -- if timestampNowMs - lastRequestTimestampMs >= 10000 then
+ -- availableImports ← ImportCompletion.collectAvailableImports
+ -- lastRequestTimestampMs := timestampNowMs
+ -- let completions := ImportCompletion.find text st.doc.initSnap.stx params availableImports
+ -- ctx.chanOut.send <| .response id (toJson completions)
+ -- pure { availableImports, lastRequestTimestampMs : AvailableImportsCache }
+
+ -- def handleRequest (id : RequestID) (method : String) (params : Json)
+ -- : WorkerM Unit := do
+ -- let ctx ← read
+ -- let st ← get
+
+ -- -- special cases
+ -- try
+ -- match method with
+ -- -- needs access to `WorkerState.rpcSessions`
+ -- | "$/lean/rpc/connect" =>
+ -- let ps ← parseParams RpcConnectParams params
+ -- let resp ← handleRpcConnect ps
+ -- ctx.chanOut.send <| .response id (toJson resp)
+ -- return
+ -- | "$/lean/rpc/call" =>
+ -- let params ← parseParams Lsp.RpcCallParams params
+ -- -- needs access to `EditableDocumentCore.diagnosticsRef`
+ -- if params.method == `Lean.Widget.getInteractiveDiagnostics then
+ -- let some seshRef := st.rpcSessions.find? params.sessionId
+ -- | ctx.chanOut.send <| .responseError id .rpcNeedsReconnect "Outdated RPC session" none
+ -- let params ← IO.ofExcept (fromJson? params.params)
+ -- let resp ← handleGetInteractiveDiagnosticsRequest params
+
+ -- let resp ← seshRef.modifyGet fun st =>
+ -- rpcEncode resp st.objects |>.map (·) ({st with objects := ·})
+ -- ctx.chanOut.send <| .response id resp
+ -- return
+ -- | "textDocument/completion" =>
+ -- let params ← parseParams CompletionParams params
+ -- -- must not wait on import processing snapshot
+ -- if ImportCompletion.isImportCompletionRequest st.doc.meta.text st.doc.initSnap.stx params
+ -- then
+ -- let importCachingTask ← handleImportCompletionRequest id params
+ -- set { st with importCachingTask? := some importCachingTask }
+ -- return
+ -- | _ => pure ()
+ -- catch e =>
+ -- ctx.chanOut.send <| .responseError id .internalError (toString e) none
+ -- return
+
+ -- -- we assume that any other request requires at least the search path
+ -- -- TODO: move into language-specific request handling
+ -- let t ← IO.bindTask st.srcSearchPathTask fun srcSearchPath => do
+ -- let rc : RequestContext :=
+ -- { rpcSessions := st.rpcSessions
+ -- srcSearchPath
+ -- doc := st.doc
+ -- hLog := ctx.hLog
+ -- initParams := ctx.initParams }
+ -- let t? ← EIO.toIO' <| handleLspRequest method params rc
+ -- let t₁ ← match t? with
+ -- | Except.error e =>
+ -- IO.asTask do
+ -- ctx.chanOut.send <| e.toLspResponseError id
+ -- | Except.ok t => (IO.mapTask · t) fun
+ -- | Except.ok resp =>
+ -- ctx.chanOut.send <| .response id (toJson resp)
+ -- | Except.error e =>
+ -- ctx.chanOut.send <| e.toLspResponseError id
+ -- queueRequest id t
+
+ -- def handleResponse (_ : RequestID) (_ : Json) : WorkerM Unit :=
+ -- return -- The only response that we currently expect here is always empty
+
+end MessageHandling
+
+section MainLoop
+ variable (hIn : FS.Stream) in
+ /--
+ The main-loop. Copied from `Lean.Server.FileWorker.mainLoop`. Use custom `WorkerM` as well
+ as custom `handleNotification`.
+ -/
+ --@[inherit_doc Lean.Server.FileWorker.mainLoop]
+ partial def mainLoop : WorkerM Unit := do
+ let mut st ← StateT.lift get
+ let msg ← hIn.readLspMessage
+ let filterFinishedTasks (acc : PendingRequestMap) (id : RequestID) (task : Task (Except IO.Error Unit))
+ : IO PendingRequestMap := do
+ if (← hasFinished task) then
+ -- Handler tasks are constructed so that the only possible errors here
+ -- are failures of writing a response into the stream.
+ if let Except.error e := task.get then
+ throwServerError s!"Failed responding to request {id}: {e}"
+ pure <| acc.erase id
+ else pure acc
+ let pendingRequests ← st.pendingRequests.foldM (fun acc id task => filterFinishedTasks acc id task) st.pendingRequests
+ st := { st with pendingRequests }
+
+ -- Opportunistically (i.e. when we wake up on messages) check if any RPC session has expired.
+ for (id, seshRef) in st.rpcSessions do
+ let sesh ← seshRef.get
+ if (← sesh.hasExpired) then
+ st := { st with rpcSessions := st.rpcSessions.erase id }
+
+ set st
+ match msg with
+ | Message.request id method (some params) =>
+ handleRequest id method (toJson params)
+ mainLoop
+ | Message.notification "exit" none =>
+ return
+ | Message.notification method (some params) =>
+ handleNotification method (toJson params)
+ mainLoop
+ | Message.response id result =>
+ handleResponse id result
+ mainLoop
+ | Message.responseError .. =>
+ -- Ignore all errors as we currently only handle a single request with an optional response
+ -- where failure is not an issue.
+ mainLoop
+ | _ => throwServerError "Got invalid JSON-RPC message"
+end MainLoop
+
+-- def runRefreshTask : WorkerM (Task (Except IO.Error Unit)) := do
+-- let ctx ← read
+-- IO.asTask (prio := Task.Priority.dedicated) do
+-- while ! (←IO.checkCanceled) do
+-- let pastProcessingStates ← ctx.chanIsProcessing.recvAllCurrent
+-- if pastProcessingStates.isEmpty then
+-- -- Processing progress has not changed since we last sent out a refresh request
+-- -- => do not send out another one for now so that we do not make the client spam
+-- -- semantic token requests while idle and already having received an up-to-date state
+-- IO.sleep 1000
+-- continue
+-- sendServerRequest ctx "workspace/semanticTokens/refresh" (none : Option Nat)
+-- IO.sleep 2000
+
+/-- Modified from `Lean.Server.FileWorker.initAndRunWorker`.
+Added `gameDir` argument, -/
+-- @[inherit_doc Lean.Server.FileWorker.initAndRunWorker]
+def initAndRunWorker (i o e : FS.Stream) (opts : Options) (gameDir : String) : IO Unit := do
+ let i ← maybeTee "fwIn.txt" false i
+ let o ← maybeTee "fwOut.txt" true o
+ let initParams ← i.readLspRequestAs "initialize" Game.InitializeParams
+
+ -- BIG ADDITION
+ o.writeLspResponse {
+ id := initParams.id
+ result := {
+ capabilities := Watchdog.mkLeanServerCapabilities
+ serverInfo? := some {
+ name := "Lean 4 Game Server"
+ version? := "0.1.1"
+ }
+ : InitializeResult
+ }
+ }
+ discard $ i.readLspNotificationAs "initialized" InitializedParams
+
+ let ⟨_, param⟩ ← i.readLspNotificationAs "textDocument/didOpen" LeanDidOpenTextDocumentParams
+ let doc := param.textDocument
+ let meta : DocumentMeta := ⟨doc.uri, doc.version, doc.text.crlfToLf.toFileMap, .always⟩ -- modification: using `.always`
+ let e := e.withPrefix s!"[{param.textDocument.uri}] "
+ let _ ← IO.setStderr e
+
+ let gameWorkerState ← getGameWorkerState gameDir initParams meta
+
+ let (ctx, st) ← try
+ initializeWorker meta o e initParams.param.toLeanInternal opts gameDir gameWorkerState
+ catch err =>
+ writeErrorDiag meta err
+ throw err
+ StateRefT'.run' (s := st) <| ReaderT.run (r := ctx) <| StateT.run' (s := gameWorkerState) do
+ try
+ let refreshTask ← StateT.lift runRefreshTask
+ mainLoop i
+ IO.cancel refreshTask
+ catch err =>
+ let st ← StateT.lift get
+ writeErrorDiag st.doc.meta err
+ throw err
+where
+ writeErrorDiag (meta : DocumentMeta) (err : Error) : IO Unit := do
+ o.writeLspMessage <| mkPublishDiagnosticsNotification meta #[{
+ range := ⟨⟨0, 0⟩, ⟨1, 0⟩⟩,
+ fullRange? := some ⟨⟨0, 0⟩, meta.text.utf8PosToLspPos meta.text.source.endPos⟩
+ severity? := DiagnosticSeverity.error
+ message := err.toString }]
+
+/--
+The main function. Simply wrapping `initAndRunWorker`.
+
+Copied from `Lean.Server.FileWorker.workerMain`. We add `args` as an argument to pass on
+the `gameDir`.
+
+TODO: The first arg `args[0]` is always expected to be `--server`. We could drop this completely.
+-/
+-- @[inherit_doc Lean.Server.FileWorker.workerMain]
+def workerMain (opts : Options) (args : List String) : IO UInt32 := do
+ let i ← IO.getStdin
+ let o ← IO.getStdout
+ let e ← IO.getStderr
+ try
+ let some gameDir := args[1]? | throwServerError "Expected second argument: gameDir"
+ initAndRunWorker i o e opts gameDir
+ IO.Process.exit 0 -- Terminate all tasks of this process
+ catch err =>
+ e.putStrLn err.toString
+ IO.Process.exit 1 -- Terminate all tasks of this process
+
+end GameServer.FileWorker
diff --git a/server/GameServerExe/FindHints.lean b/server/GameServerExe/FindHints.lean
new file mode 100644
index 00000000..98a9e563
--- /dev/null
+++ b/server/GameServerExe/FindHints.lean
@@ -0,0 +1,132 @@
+import GameServerExe.Widget.InteractiveGoalWithHints
+import GameServer.EnvExtensions
+import GameServerExe.Util.FVarBijection
+import GameServerExe.Widget.InteractiveDiagnostic
+
+import I18n
+
+namespace GameServer
+
+open Lean
+open Server
+open GameServer.Widget
+open Lean.Widget (InteractiveDiagnostic)
+open RequestM
+open Meta
+
+
+/-- expects a file name of the form `/{worldId}/Level_{levelId}.lean` where `{levelId}` is a Nat. -/
+def levelIdFromFileName? (initParams : Lsp.InitializeParams) (fileName : String) : Option LevelId := Id.run do
+ let fileParts := fileName.splitOn "/"
+ if fileParts.length == 3 then
+ let some game := initParams.rootUri?
+ | return none
+ -- the filename has the form `Level_01.lean` and we extract `01`.
+ let some level := ((fileParts[2]!.splitOn ".")[0]!.splitOn "_")[1]!.toNat?
+ | return none
+ return some {game := .mkSimple game, world := .mkSimple fileParts[1]!, level := level}
+ return none
+
+def getLevelByFileName? {m : Type → Type} [Monad m] [MonadEnv m] (initParams : Lsp.InitializeParams) (fileName : String) : m (Option GameServer.Level) := do
+ let some levelId := levelIdFromFileName? initParams fileName
+ | return none
+ return ← getLevel? levelId
+
+-- TODO: no need to have `RequestM`, just anything where `mut` works
+/-- Add custom diagnostics about whether the level is completed. -/
+def completionDiagnostics (goalCount : Nat) (prevGoalCount : Nat) (completed : Bool)
+ (completedWithWarnings : Bool) (pos : Lsp.Position)
+ (startDiags : Array InteractiveDiagnostic := #[]) :
+ RequestM <| Array InteractiveDiagnostic := do
+ let mut out : Array InteractiveDiagnostic := startDiags
+ if goalCount == 0 then
+ if completed then
+ out := out.push {
+ -- TODO: marking these with `t!` has the implication that every game
+ -- needs to translate these messages again,
+ -- but cannot think of another option
+ -- that would not involve manually adding them somewhere in the translation files.
+ message := .text t!"level completed! 🎉"
+ range := {
+ start := pos
+ «end» := pos
+ }
+ severity? := Lsp.DiagnosticSeverity.information }
+ else if completedWithWarnings then
+ out := out.push {
+ message := .text t!"level completed with warnings… 🎭"
+ range := {
+ start := pos
+ «end» := pos
+ }
+ severity? := Lsp.DiagnosticSeverity.information }
+ else
+ pure ()
+ else if goalCount < prevGoalCount then
+ -- If there is any errors, goals might vanish without being 'solved'
+ -- so showing the message "intermediate goal solved" would be confusing.
+ if (¬ (filterUnsolvedGoal startDiags).any (·.severity? == some .error)) then
+ out := out.push {
+ message := .text t!"intermediate goal solved! 🎉"
+ range := {
+ start := pos
+ «end» := pos
+ }
+ severity? := Lsp.DiagnosticSeverity.information
+ }
+
+ return out
+
+open Meta in
+/-- Find all hints whose trigger matches the current goal -/
+def findHints (goal : MVarId) (m : DocumentMeta) (initParams : Lsp.InitializeParams) : MetaM (Array GameHint) := do
+ goal.withContext do
+ let some level ← getLevelByFileName? initParams m.mkInputContext.fileName
+ | throwError "Level not found: {m.mkInputContext.fileName}"
+ let hints ← level.hints.filterMapM fun hint => do
+ openAbstractCtxResult hint.goal fun hintFVars hintGoal => do
+ let reducer := if hint.defeq then whnf else pure
+ if let some fvarBij := matchExpr
+ (← reducer <| ← instantiateMVars $ hintGoal)
+ (← reducer <| ← instantiateMVars $ ← inferType $ mkMVar goal)
+ then
+
+ -- NOTE: This code for `hintFVarsNames` is also duplicated in the
+ -- "Statement" command, where `hint.rawText` is created. They need to be matching.
+ -- NOTE: This is a bit a hack of somebody who does not know how meta-programming works.
+ -- All we want here is a list of `userNames` for the `FVarId`s in `hintFVars`...
+ -- and we wrap them in `«{}»` here since I don't know how to do it later.
+ let mut hintFVarsNames : Array Expr := #[]
+ for fvar in hintFVars do
+ let name₁ ← fvar.fvarId!.getUserName
+ hintFVarsNames := hintFVarsNames.push <| Expr.fvar ⟨.mkSimple s!"«\{{name₁}}»"⟩
+
+ let lctx := (← goal.getDecl).lctx -- the player's local context
+ if let some bij ← matchDecls hintFVars lctx.getFVars
+ (strict := hint.strict) (initBij := fvarBij) (defeq := hint.defeq)
+ then
+ let userFVars := hintFVars.map fun v => bij.forward.getD v.fvarId! v.fvarId!
+ -- Evaluate the text in the player's context to get the new variable names.
+ let text := (← evalHintMessage hint.text) (userFVars.map Expr.fvar)
+ let ctx := {env := ← getEnv, mctx := ← getMCtx, lctx := lctx, opts := {}}
+ let text ← (MessageData.withContext ctx text).toString
+
+ -- Here we map the goal's variable names to the player's variable names.
+ let mut varNames : Array <| Name × Name := #[]
+ for (fvar₁, fvar₂) in bij.forward.toArray do
+ -- get the `userName` of the fvar in the opened local context of the hint.
+ let name₁ ← fvar₁.getUserName
+ -- get the `userName` in the player's local context.
+ let name₂ := (lctx.get! fvar₂).userName
+ varNames := varNames.push (name₁, name₂)
+
+ return some {
+ text := text,
+ hidden := hint.hidden,
+ rawText := hint.rawText,
+ varNames := varNames }
+
+ else return none
+ else
+ return none
+ return hints
diff --git a/server/GameServer/ImportModules.lean b/server/GameServerExe/ImportModules.lean
similarity index 92%
rename from server/GameServer/ImportModules.lean
rename to server/GameServerExe/ImportModules.lean
index 055bed1c..cb3a05c5 100644
--- a/server/GameServer/ImportModules.lean
+++ b/server/GameServerExe/ImportModules.lean
@@ -1,10 +1,12 @@
-import Lean.Environment
-import Std.Tactic.OpenPrivate
+import Batteries.Tactic.OpenPrivate
import Lean.Data.Lsp.Communication
+import Lean.Environment
open Lean
-inductive LoadingKind := | finalizeExtensions | loadConstants
+inductive LoadingKind where
+ | finalizeExtensions
+ | loadConstants
deriving ToJson
structure LoadingParams : Type where
@@ -64,8 +66,8 @@ where
def finalizeImport' (s : ImportState) (imports : Array Import) (opts : Options) (trustLevel : UInt32 := 0) : IO Environment := do
let numConsts := s.moduleData.foldl (init := 0) fun numConsts mod =>
numConsts + mod.constants.size + mod.extraConstNames.size
- let mut const2ModIdx : HashMap Name ModuleIdx := mkHashMap (capacity := numConsts)
- let mut constantMap : HashMap Name ConstantInfo := mkHashMap (capacity := numConsts)
+ let mut const2ModIdx : Std.HashMap Name ModuleIdx := .empty (capacity := numConsts)
+ let mut constantMap : Std.HashMap Name ConstantInfo := .empty (capacity := numConsts)
for h:modIdx in [0:s.moduleData.size] do
if modIdx % 100 = 0 then
let percentage := modIdx * 100 / s.moduleData.size
@@ -74,8 +76,8 @@ def finalizeImport' (s : ImportState) (imports : Array Import) (opts : Options)
param := {counter := percentage, kind := .loadConstants : LoadingParams} }
let mod := s.moduleData[modIdx]'h.upper
for cname in mod.constNames, cinfo in mod.constants do
- match constantMap.insert' cname cinfo with
- | (constantMap', replaced) =>
+ match constantMap.containsThenInsertIfNew cname cinfo with
+ | (replaced, constantMap') =>
constantMap := constantMap'
if replaced then
throwAlreadyImported s const2ModIdx modIdx cname
diff --git a/server/GameServerExe/Lean/Message.lean b/server/GameServerExe/Lean/Message.lean
new file mode 100644
index 00000000..efa7be47
--- /dev/null
+++ b/server/GameServerExe/Lean/Message.lean
@@ -0,0 +1,15 @@
+import Lean.Parser.Types
+import Lean.Elab.Command
+
+namespace Lean
+
+/-- Add a message. use `(severity := .warning)` to specify the severity. -/
+def addMessage (info : SourceInfo) (inputCtx : Parser.InputContext)
+ (severity := MessageSeverity.warning) (s : MessageData) :
+ Elab.Command.CommandElabM Unit := do
+ modify fun st => { st with
+ messages := st.messages.add {
+ fileName := inputCtx.fileName
+ severity := severity
+ pos := inputCtx.fileMap.toPosition (info.getPos?.getD 0)
+ data := s }}
diff --git a/server/GameServerExe/LoadData.lean b/server/GameServerExe/LoadData.lean
new file mode 100644
index 00000000..e8e34a07
--- /dev/null
+++ b/server/GameServerExe/LoadData.lean
@@ -0,0 +1,23 @@
+import GameServer.Config.SaveData
+import GameServer.EnvExtensions
+import I18n
+
+namespace GameServer
+
+open Lean GameData
+
+def loadData (f : System.FilePath) (α : Type) [FromJson α] : IO α := do
+ let str ← IO.FS.readFile f
+ let json ← match Json.parse str with
+ | .ok v => pure v
+ | .error e => throw (IO.userError e)
+ let data ← match fromJson? json with
+ | .ok v => pure v
+ | .error e => throw (IO.userError e)
+ return data
+
+def loadGameData (gameDir : System.FilePath) : IO Game :=
+ loadData (gameDir / gameDataPath / gameFileName) Game
+
+def loadLevelData (gameDir : System.FilePath) (worldId : Name) (levelId : Nat) : IO LevelInfo :=
+ loadData (gameDir / gameDataPath / levelFileName worldId levelId) LevelInfo
diff --git a/server/GameServer/Game.lean b/server/GameServerExe/Lsp.lean
similarity index 54%
rename from server/GameServer/Game.lean
rename to server/GameServerExe/Lsp.lean
index c64d424f..22bb2b3c 100644
--- a/server/GameServer/Game.lean
+++ b/server/GameServerExe/Lsp.lean
@@ -1,44 +1,24 @@
-import GameServer.RpcHandlers
+import Lean.Data.Lsp.InitShutdown
-open Lean
+namespace GameServer.Lsp
-structure GameServerState :=
-(env : Lean.Environment)
-(game : Name)
-(gameDir : String)
-(inventory : Array String)
-(difficulty : Nat)
+open Lean Lsp
-abbrev GameServerM := StateT GameServerState Server.Watchdog.ServerM
-
-instance : MonadEnv GameServerM := {
- getEnv := do return (← get).env
- modifyEnv := fun f => do
- let s ← get
- set {s with env := f s.env}
-}
-
-namespace Game
-open Server
-open Watchdog
-open Lsp
-open JsonRpc
-open IO
-
-/- Game-specific version of `InitializeParams` that allows for extra options: -/
-
-structure InitializationOptions extends Lean.Lsp.InitializationOptions :=
+/-- Game-specific version of `InitializationOptions` that allows for extra options: -/
+structure InitializationOptions extends Lean.Lsp.InitializationOptions where
difficulty : Nat
inventory : Array String
deriving ToJson, FromJson
-structure InitializeParams where
+/-- Copy of `Lean.Lsp.InitializeParams` with custom `InitializationOptions`. -/
+-- @[inherit_doc Lean.Lsp.InitializeParams]
+structure InitializeParams where
processId? : Option Int := none
clientInfo? : Option ClientInfo := none
/- We don't support the deprecated rootPath
(rootPath? : Option String) -/
rootUri? : Option String := none
- initializationOptions? : Option InitializationOptions := none
+ initializationOptions? : Option GameServer.Lsp.InitializationOptions := none
capabilities : ClientCapabilities
/-- If omitted, we default to off. -/
trace : Trace := Trace.off
@@ -63,18 +43,6 @@ instance : FromJson InitializeParams where
trace,
workspaceFolders?.toOption⟩
-def InitializeParams.toLeanInternal (p : InitializeParams) : Lean.Lsp.InitializeParams :=
-{
- processId? := p.processId?
- clientInfo? := p.clientInfo?
- rootUri? := p.rootUri?
- initializationOptions? := p.initializationOptions?.map fun o => {
- editDelay? := o.editDelay?
- hasWidgets? := o.hasWidgets?
- }
- capabilities := p.capabilities
- trace := p.trace
- workspaceFolders? := p.workspaceFolders?
-}
-
-end Game
+def InitializeParams.toLeanInternal (params : InitializeParams) : Lean.Lsp.InitializeParams :=
+ { params with
+ initializationOptions? := params.initializationOptions?.map fun options => { options with }}
diff --git a/server/GameServerExe/Message.lean b/server/GameServerExe/Message.lean
new file mode 100644
index 00000000..69396b71
--- /dev/null
+++ b/server/GameServerExe/Message.lean
@@ -0,0 +1,145 @@
+import Lean
+import GameServer.Layer.Extension
+
+set_option linter.unusedVariables false
+
+namespace GameServer
+
+open Lean
+
+def createDebugNotification (msg : String) : JsonRpc.Message :=
+ let params : Json.Structured := .arr #[msg] -- TODO: didn't know how to create a `.obj`
+ .notification "lean4game/debug" params
+
+/--
+Send debug messages as `lean4game/debug` RPC notification.
+
+Can be used to print debug messages from within `GameServerExe` to the server console.
+
+Currently they are ignored by the frontend, but in dev mode they
+appear as `DEBUG:` message in the server's shell (see `relay/index.mjs`)
+-/
+def _root_.debug_msg (msg : String) : IO Unit := do
+ let o ← IO.getStdout
+ o.writeLspMessage (createDebugNotification msg)
+
+def getLevelIdFromUri (game : Game) (uri : String) : LevelId :=
+ let components := uri.split ("\\/_.".contains ·)
+ match components.reverse with
+ | "lean" :: lvl :: "L" :: worldId :: gameId ::_ =>
+ { game := game.name,
+ world := .mkSimple worldId,
+ level := lvl.toNat! }
+ | _ => panic! s!"[GameServer] ERROR: bad URI '{uri}'"
+
+/--
+Takes the JSON of an element of `contentChanges` in the rpc notif. `textDocument/didChange`
+and applies the `shift` to all ranges.
+-/
+def shiftRange (shift : Nat → Nat) (change : Json) : Json := Id.run do
+ let mut range := change.getObjValD "range"
+ let mut start := range.getObjValD "start"
+ let mut «end» := range.getObjValD "end"
+ let .ok startLine := start.getObjValAs? Nat "line"
+ | panic! "[GameServer] unhandled"
+ let .ok endLine := end.getObjValAs? Nat "line"
+ | panic! "[GameServer] unhandled"
+ start := start.setObjValAs! "line" (shift startLine)
+ «end» := «end».setObjValAs! "line" (shift endLine)
+ range := range.setObjVal! "start" start
+ range := range.setObjVal! "end" «end»
+ change.setObjVal! "range" range
+
+/-- Redirect message from the client to the Lean server. -/
+def forwardMessage (msg : JsonRpc.Message) : CoreM JsonRpc.Message := do
+ let game ← GameServer.getCurGame
+ match msg with
+ | .notification "initialized" params? =>
+ return msg
+ | .notification method@("textDocument/didOpen") none =>
+ debug_msg s!"BUG: I thought receiving 'textDocument/didOpen' without params was impossible"
+ IO.Process.exit 2
+ | .notification method@("textDocument/didOpen") (some params') =>
+ let mut params : Json := ToJson.toJson params'
+ let textDocument := params.getObjValD "textDocument"
+ let .ok content := textDocument.getObjValAs? String "text"
+ | panic! s!"[GameServer]: ERROR: received didOpen notification with invalid parameters!"
+ let .ok uri := textDocument.getObjValAs? String "uri"
+ | panic! s!"[GameServer]: ERROR: received didOpen notification with invalid parameters!"
+
+ -- URI example: `file:///mygame/DemoWorld1/L_1.lean`
+ -- TODO: is this also true on Windows?
+
+ let levelId := getLevelIdFromUri game uri
+ debug_msg s!"[GameServer] `didOpen` {levelId}"
+ let some level ← getLevel? levelId
+ | panic! "[GameServer] Level not found"
+
+ let template := s!"example : True := by\n{content}\ndone"
+
+ params := params.setObjVal! "textDocument" (textDocument.setObjVal! "text" template)
+ let .ok paramsStructured := Json.toStructured? params
+ | panic! "[GameServer] unhandled"
+
+ return .notification method paramsStructured
+ -- textDocument/didChange
+
+ | .notification method@("textDocument/didChange") (some params') =>
+ let mut params : Json := ToJson.toJson params'
+ let textDocument := params.getObjValD "textDocument"
+ let .ok contentChanges := (params.getObjValD "contentChanges").getArr?
+ | panic! "[GameServer] unhandled"
+
+ let contentChangeNew : Json := .arr <| contentChanges.map (shiftRange (·+1))
+
+ params := params.setObjVal! "contentChanges" contentChangeNew
+ let .ok paramsStructured := Json.toStructured? params
+ | panic! "[GameServer] unhandled"
+ debug_msg s!"{params}"
+ return .notification method paramsStructured
+
+
+ | .request id method params? =>
+ debug_msg s!"TODO client request {method} not implemented!"
+
+ /-
+ monaco requests to modify:
+
+ * textDocument/didOpen: params.textDocument.text
+ * textDocument/codeAction: params.range
+ * textDocument/semanticTokens/range: params.range
+ * textDocument/didChange: params.contentChanges
+ * textDocument/completion: params.position
+ * textDocument/hover: params.position
+ * textDocument/documentHighlight: params.position
+ * ...
+ * $/lean/rpc/call
+ * Lean.Widget.getInteractiveGoals: params.position
+ * Lean.Widget.getInteractiveTermGoal: params.position
+ * Lean.Widget.getWidgets: params.position
+ * Lean.Widget.getInteractiveDiagnostics: params.lineRange, params.position
+ * ...
+ -/
+ return msg
+ | .notification method params? =>
+ debug_msg s!"TODO client notification {method} not implemented!"
+ return msg
+ | .response id result =>
+ return msg
+ | .responseError id code message data? =>
+ return msg
+
+/-- Redirect message from the Lean server back to the client. -/
+def returnMessage (msg : JsonRpc.Message) : CoreM JsonRpc.Message := do
+ let game ← GameServer.getCurGame
+ match msg with
+ | .request id method params? =>
+ debug_msg s!"TODO server request {method} not implemented!"
+ return msg
+ | .notification method params? =>
+ debug_msg s!"TODO server notification {method} not implemented!"
+ return msg
+ | .response id result =>
+ return msg
+ | .responseError id code message data? =>
+ return msg
diff --git a/server/GameServerExe/Rpc.lean b/server/GameServerExe/Rpc.lean
new file mode 100644
index 00000000..5f80e248
--- /dev/null
+++ b/server/GameServerExe/Rpc.lean
@@ -0,0 +1,30 @@
+import GameServerExe.Rpc.GetProofState
+import GameServerExe.Rpc.GetInteractiveGoals
+
+open GameServer Widget
+open Lean Server
+
+builtin_initialize
+ registerBuiltinRpcProcedure
+ `Game.getInteractiveGoals
+ Lsp.PlainGoalParams
+ (Option <| InteractiveGoals
+ )
+ getInteractiveGoals
+
+builtin_initialize
+ registerBuiltinRpcProcedure
+ `Game.getProofState
+ Lsp.PlainGoalParams
+ (Option ProofState)
+ getProofState
+
+private def rpcTest (_ : Lsp.PlainGoalParams) : RequestM (RequestTask String) := do
+ return RequestTask.pure "Test RPC answer."
+
+builtin_initialize
+ registerBuiltinRpcProcedure
+ `lean4game.test
+ Lsp.PlainGoalParams
+ String
+ rpcTest
diff --git a/server/GameServerExe/Rpc/GetInteractiveGoals.lean b/server/GameServerExe/Rpc/GetInteractiveGoals.lean
new file mode 100644
index 00000000..09281701
--- /dev/null
+++ b/server/GameServerExe/Rpc/GetInteractiveGoals.lean
@@ -0,0 +1,52 @@
+import GameServerExe.Widget.InteractiveGoalWithHints
+import GameServer.Tactic.Hint.Defs
+import GameServerExe.Util.FVarBijection
+import I18n
+namespace GameServer
+
+open Widget
+
+set_option autoImplicit false
+
+open Lean
+open Server
+open Lean.Widget (InteractiveDiagnostic)
+open GameServer.Widget
+open RequestM
+open Meta
+
+open RequestM in
+
+-- The editor apparently uses this
+def getInteractiveGoals (p : Lsp.PlainGoalParams) : RequestM (RequestTask (Option <| InteractiveGoals)) := do
+ let doc ← readDoc
+ -- let rc ← readThe RequestContext
+ let text := doc.meta.text
+ let hoverPos := text.lspPosToUtf8Pos p.position
+ -- TODO: I couldn't find a good condition to find the correct snap. So we are looking
+ -- for the first snap with goals here:
+ withWaitFindSnap doc (fun s => ¬ (s.infoTree.goalsAt? doc.meta.text hoverPos).isEmpty)
+ (notFoundX := return none) fun snap => do
+ if let rs@(_ :: _) := snap.infoTree.goalsAt? doc.meta.text hoverPos then
+ let goals : List <| Array InteractiveGoal ← rs.mapM fun { ctxInfo := ci, tacticInfo := ti, useAfter := useAfter, .. } => do
+ let ciAfter := { ci with mctx := ti.mctxAfter }
+ let ci := if useAfter then ciAfter else { ci with mctx := ti.mctxBefore }
+ -- compute the interactive goals
+ let goals ← ci.runMetaM {} do
+ return List.toArray <| if useAfter then ti.goalsAfter else ti.goalsBefore
+ let goals ← ci.runMetaM {} do
+ goals.mapM fun goal => do
+ -- let hints ← findHints goal doc.meta rc.initParams
+ return ← goalToInteractive goal
+ -- compute the goal diff
+ -- let goals ← ciAfter.runMetaM {} (do
+ -- try
+ -- Widget.diffInteractiveGoals useAfter ti goals
+ -- catch _ =>
+ -- -- fail silently, since this is just a bonus feature
+ -- return goals
+ -- )
+ return goals
+ return some <| ⟨goals.foldl (· ++ ·) #[]⟩
+ else
+ return none
diff --git a/server/GameServerExe/Rpc/GetProofState.lean b/server/GameServerExe/Rpc/GetProofState.lean
new file mode 100644
index 00000000..5c679b4b
--- /dev/null
+++ b/server/GameServerExe/Rpc/GetProofState.lean
@@ -0,0 +1,146 @@
+import GameServerExe.Widget.InteractiveGoalWithHints
+import GameServerExe.Widget.InteractiveDiagnostic
+import GameServerExe.FindHints
+import Lean
+
+namespace GameServer
+
+open GameServer.Widget
+
+open Lean Server RequestM
+
+open Lean.Widget (InteractiveDiagnostic)
+
+-- NOTE: Changes here need to be reflected in the corresponding `interface` in `rcp_api.ts`
+-- on the client-side.
+/-- Collected goals throughout the proof. Used for communication with the game client. -/
+structure ProofState where
+ /-- goals after each line. includes the hints. -/
+ steps : Array <| InteractiveGoalsWithHints
+ /-- diagnostics contains all errors and warnings.
+
+ TODO: I think they contain information about which line they belong to. Verify this.
+ -/
+ diagnostics : Array InteractiveDiagnostic := default
+ /-- Whether the level is considered solved. -/
+ completed : Bool
+ completedWithWarnings : Bool
+ lastPos : Nat -- only for debugging
+deriving RpcEncodable
+
+/-- Request that returns the goals at the end of each line of the tactic proof
+plus the diagnostics (i.e. warnings/errors) for the proof.
+ -/
+def getProofState (_ : Lsp.PlainGoalParams) : RequestM (RequestTask (Option ProofState)) := do
+ let doc ← readDoc
+ let rc ← readThe RequestContext
+ let text := doc.meta.text
+
+ withWaitFindSnap
+ doc
+ -- TODO (Alex): I couldn't find a good condition to find the correct snap. So we are looking
+ -- for the first snap with goals here.
+ -- NOTE (Jon): The entire proof is in one snap, so hoped that Position `0` is good enough.
+ (fun snap => ¬ (snap.infoTree.goalsAt? doc.meta.text 0).isEmpty)
+ (notFoundX := return none)
+ fun snap => do
+ -- `snap` is the one snapshot containing the entire proof.
+ let mut steps : Array <| InteractiveGoalsWithHints := #[]
+
+ -- Question: Is there a difference between the diags of this snap and the last snap?
+ -- Should we get the diags from there?
+ -- Answer: The last snap only copied the diags from the end of this snap
+ let mut diag : Array InteractiveDiagnostic := #[] -- TODO: snap.interactiveDiags.toArray
+
+ -- Level is completed if there are no errors or warnings
+ let completedWithWarnings : Bool := ¬ diag.any (·.severity? == some .error)
+ let completed : Bool := completedWithWarnings ∧ ¬ diag.any (·.severity? == some .warning)
+
+ let mut intermediateGoalCount := 0
+
+ -- only the positions that have non-whitespace characters since the last position
+ -- should add a new proof step.
+ let positionsWithSource : Array (String.Pos × String) :=
+ text.positions.zipWithIndex.filterMap (
+ fun (pos, i) => match i with
+ | 0 => some (pos, "")
+ | i' + 1 =>
+ let source : String := Substring.toString ⟨text.source, text.positions.get! i', pos⟩
+ if source.trim.length == 0 then
+ none
+ else
+ some (pos, source))
+
+ -- Drop the last position as we ensured that there is always a newline at the end
+ for ((pos, source), i) in positionsWithSource.zipWithIndex do
+ -- iterate over all steps in the proof and get the goals and hints at each position
+
+ -- diags are labeled in Lsp-positions, which differ from the lean-internal
+ -- positions by `1`.
+ let lspPosAt := text.utf8PosToLspPos pos
+
+ let mut diagsAtPos : Array InteractiveDiagnostic := filterUnsolvedGoal <|
+ -- `+1` for getting the errors after the line.
+ match i with
+ | 0 =>
+ -- `lspPosAt` is `(0, 0)`
+ diag.filter (fun d => d.range.start == lspPosAt )
+ | i' + 1 =>
+ diag.filter (fun d =>
+ ((text.utf8PosToLspPos <| (positionsWithSource.get! i').1) ≤ d.range.start) ∧
+ d.range.start < lspPosAt )
+
+ if let goalsAtResult@(_ :: _) := snap.infoTree.goalsAt? doc.meta.text pos then
+ let goalsAtPos' : List <| List InteractiveGoalWithHints ← goalsAtResult.mapM
+ fun { ctxInfo := ci, tacticInfo := tacticInfo, useAfter := useAfter, .. } => do
+ -- TODO: What does this function body do?
+ -- let ciAfter := { ci with mctx := ti.mctxAfter }
+ let ci := if useAfter then
+ { ci with mctx := tacticInfo.mctxAfter }
+ else
+ { ci with mctx := tacticInfo.mctxBefore }
+ -- compute the interactive goals
+ let goalMvars : List MVarId ← ci.runMetaM {} do
+ return if useAfter then tacticInfo.goalsAfter else tacticInfo.goalsBefore
+
+ let interactiveGoals : List InteractiveGoalWithHints ← ci.runMetaM {} do
+ goalMvars.mapM fun goal => do
+ let hints ← findHints goal doc.meta rc.initParams
+ let interactiveGoal ← goalToInteractive goal
+ return ⟨interactiveGoal, hints⟩
+ -- TODO: This code is way old, can it be deleted?
+ -- compute the goal diff
+ -- let goals ← ciAfter.runMetaM {} (do
+ -- try
+ -- Widget.diffInteractiveGoals useAfter ti goals
+ -- catch _ =>
+ -- -- fail silently, since this is just a bonus feature
+ -- return goals
+ -- )
+ return interactiveGoals
+ let goalsAtPos : Array InteractiveGoalWithHints := ⟨goalsAtPos'.foldl (· ++ ·) []⟩
+
+ diagsAtPos ← completionDiagnostics goalsAtPos.size intermediateGoalCount
+ completed completedWithWarnings lspPosAt diagsAtPos
+
+ intermediateGoalCount := goalsAtPos.size
+
+ steps := steps.push ⟨goalsAtPos, source, diagsAtPos, lspPosAt.line, lspPosAt.character⟩
+ else
+ -- No goals present
+ steps := steps.push ⟨#[], source, diagsAtPos, lspPosAt.line, none⟩
+
+ -- Filter out the "unsolved goals" message
+ diag := filterUnsolvedGoal diag
+
+ let lastPos := text.utf8PosToLspPos positionsWithSource.back!.1
+ let remainingDiags : Array InteractiveDiagnostic :=
+ diag.filter (fun d => lastPos ≤ d.range.start)
+
+ return some {
+ steps := steps,
+ diagnostics := remainingDiags,
+ completed := completed,
+ completedWithWarnings := completedWithWarnings,
+ lastPos := lastPos.line
+ }
diff --git a/server/GameServerExe/State.lean b/server/GameServerExe/State.lean
new file mode 100644
index 00000000..00ad2674
--- /dev/null
+++ b/server/GameServerExe/State.lean
@@ -0,0 +1,22 @@
+import Lean.Environment
+import Lean.Server.Watchdog
+
+namespace GameServer
+
+open Lean
+
+structure GameServerState where
+ env : Lean.Environment
+ game : Name
+ gameDir : String
+ inventory : Array String
+ difficulty : Nat
+
+abbrev GameServerM := StateT GameServerState Server.Watchdog.ServerM
+
+instance : MonadEnv GameServerM := {
+ getEnv := do return (← get).env
+ modifyEnv := fun f => do
+ let s ← get
+ set {s with env := f s.env}
+}
diff --git a/server/GameServerExe/Util/FVarBijection.lean b/server/GameServerExe/Util/FVarBijection.lean
new file mode 100644
index 00000000..77939997
--- /dev/null
+++ b/server/GameServerExe/Util/FVarBijection.lean
@@ -0,0 +1,87 @@
+import Lean
+
+namespace GameServer
+
+open Lean Meta
+
+structure FVarBijection where
+ forward : Std.HashMap FVarId FVarId
+ backward : Std.HashMap FVarId FVarId
+
+instance : EmptyCollection FVarBijection := ⟨∅, ∅⟩
+
+def FVarBijection.insert (bij : FVarBijection) (a b : FVarId) : FVarBijection :=
+ ⟨bij.forward.insert a b, bij.backward.insert b a⟩
+
+def FVarBijection.insert? (bij : FVarBijection) (a b : FVarId) : Option FVarBijection :=
+ let a' := bij.forward.get? a
+ let b' := bij.forward.get? b
+ if (a' == none || a' == some b) && (b' == none || b' == some a)
+ then some $ bij.insert a b
+ else none
+
+/-- Checks if `pattern` and `e` are equal up to FVar identities. -/
+partial def matchExpr (pattern : Expr) (e : Expr) (bij : FVarBijection := {}) :
+ Option FVarBijection :=
+ match pattern, e with
+ | .bvar i1, .bvar i2 => if i1 == i2 then bij else none
+ | .fvar i1, .fvar i2 => bij.insert? i1 i2
+ | .mvar _, .mvar _ => bij
+ | .sort _u1, .sort _u2 => bij -- TODO?
+ | .const n1 _ls1, .const n2 _ls2 =>
+ if n1 == n2 then bij else none -- && (← (ls1.zip ls2).allM fun (l1, l2) => Meta.isLevelDefEq l1 l2)
+ | .app f1 a1, .app f2 a2 =>
+ some bij
+ |> (Option.bind · (fun bij => matchExpr f1 f2 bij))
+ |> (Option.bind · (fun bij => matchExpr a1 a2 bij))
+ | .lam _ t1 b1 _, .lam _ t2 b2 _ =>
+ some bij
+ |> (Option.bind · (fun bij => matchExpr t1 t2 bij))
+ |> (Option.bind · (fun bij => matchExpr b1 b2 bij))
+ | .forallE _ t1 b1 _, .forallE _ t2 b2 _ =>
+ some bij
+ |> (Option.bind · (fun bij => matchExpr t1 t2 bij))
+ |> (Option.bind · (fun bij => matchExpr b1 b2 bij))
+ | .letE _ t1 v1 b1 _, .letE _ t2 v2 b2 _ =>
+ some bij
+ |> (Option.bind · (fun bij => matchExpr t1 t2 bij))
+ |> (Option.bind · (fun bij => matchExpr v1 v2 bij))
+ |> (Option.bind · (fun bij => matchExpr b1 b2 bij))
+ | .lit l1, .lit l2 =>
+ if l1 == l2 then bij else none
+ | .proj i1 n1 e1, .proj i2 n2 e2 =>
+ if i1 == i2 && n1 == n2 then matchExpr e1 e2 bij else none
+ -- ignore mdata:
+ | .mdata _ pattern', _ =>
+ matchExpr pattern' e bij
+ | _, .mdata _ e' =>
+ matchExpr pattern e' bij
+ | _, _ => none
+
+/-- Check if each fvar in `patterns` has a matching fvar in `fvars` -/
+def matchDecls (patterns : Array Expr) (fvars : Array Expr) (strict := true)
+ (initBij : FVarBijection := {}) (defeq := false) : MetaM (Option FVarBijection) := do
+ let reducer := if defeq then whnf else pure
+ -- We iterate through the array backwards hoping that this will find us faster results
+ -- TODO: implement backtracking
+ let mut bij := initBij
+ for i in [:patterns.size] do
+ let pattern := patterns[patterns.size - i - 1]!
+ if bij.forward.contains pattern.fvarId! then
+ continue
+ for j in [:fvars.size] do
+ let fvar := fvars[fvars.size - j - 1]!
+ if bij.backward.contains fvar.fvarId! then
+ continue
+
+ if let some bij' := matchExpr
+ (← reducer <| ← instantiateMVars $ ← inferType pattern)
+ (← reducer <| ← instantiateMVars $ ← inferType fvar) bij then
+ -- usedFvars := usedFvars.set! (fvars.size - j - 1) true
+ bij := bij'.insert pattern.fvarId! fvar.fvarId!
+ break
+ if ! bij.forward.contains pattern.fvarId! then return none
+
+ if !strict || fvars.all (fun fvar => bij.backward.contains fvar.fvarId!)
+ then return some bij
+ else return none
diff --git a/server/GameServerExe/Widget/InteractiveDiagnostic.lean b/server/GameServerExe/Widget/InteractiveDiagnostic.lean
new file mode 100644
index 00000000..f493c088
--- /dev/null
+++ b/server/GameServerExe/Widget/InteractiveDiagnostic.lean
@@ -0,0 +1,12 @@
+import Lean.Widget.InteractiveDiagnostic
+
+namespace GameServer.Widget
+
+open Lean.Widget (InteractiveDiagnostic)
+
+/-- filter the "unsolved goals" message -/
+def filterUnsolvedGoal (a : Array InteractiveDiagnostic) :
+ Array InteractiveDiagnostic :=
+ a.filter (fun d => match d.message with
+ | .append ⟨(.text x) :: _⟩ => x != "unsolved goals"
+ | _ => true)
diff --git a/server/GameServer/InteractiveGoal.lean b/server/GameServerExe/Widget/InteractiveGoal.lean
similarity index 71%
rename from server/GameServer/InteractiveGoal.lean
rename to server/GameServerExe/Widget/InteractiveGoal.lean
index f9b754b3..704c3f40 100644
--- a/server/GameServer/InteractiveGoal.lean
+++ b/server/GameServerExe/Widget/InteractiveGoal.lean
@@ -1,16 +1,63 @@
-import GameServer.Structures
+import Lean.Widget.InteractiveGoal
/-!
This file is a modified copy of `Lean.Widget.InteractiveGoal`.
-Note that the structures have been moved to `Structures.lean`, but most of the
-functions here must be duplicated from `Lean.Widget.InteractiveGoal` in order
-to use the duplicated structures.
+We add a field `isAssumption?` to `InteractiveHypothesisBundle`, and
+`addInteractiveHypothesisBundle` populates this new field.
+
+Everything else is just copy-pasted in order to use the modified structure.
-/
-namespace GameServer
+namespace GameServer.Widget
+open Lean Widget
+
+open Server
+
+/-
+Extend the interactive hypothesis bundle with an option to distinguish
+"assumptions" from "objects". "Assumptions" are hypotheses of type `Prop`.
+-/
+@[inherit_doc Lean.Widget.InteractiveHypothesisBundle]
+structure InteractiveHypothesisBundle extends Lean.Widget.InteractiveHypothesisBundle where
+ /-- The hypothesis's type is of type `Prop` -/
+ isAssumption? : Option Bool := none
+deriving RpcEncodable
-open Lean Lean.Widget Lean.Server
+-- duplicated but with custom `InteractiveHypothesisBundle`
+@[inherit_doc Lean.Widget.InteractiveGoalCore]
+structure InteractiveGoalCore where
+ /-- (GameServer) use custom `InteractiveHypothesisBundle` -/
+ hyps : Array InteractiveHypothesisBundle
+ /-- The target type. -/
+ type : CodeWithInfos
+ /-- Metavariable context that the goal is well-typed in. -/
+ ctx : WithRpcRef Elab.ContextInfo
+
+-- duplicated but with custom `InteractiveGoalCore`
+@[inherit_doc Lean.Widget.InteractiveGoal]
+structure InteractiveGoal extends InteractiveGoalCore where
+ /-- The name `foo` in `case foo`, if any. -/
+ userName? : Option String
+ /-- The symbol to display before the target type. Usually `⊢ ` but `conv` goals use `∣ `
+ and it could be extended. -/
+ goalPrefix : String
+ /-- Identifies the goal (ie with the unique name of the MVar that it is a goal for.) -/
+ mvarId : MVarId
+ /-- If true, the goal was not present on the previous tactic state. -/
+ isInserted? : Option Bool := none
+ /-- If true, the goal will be removed on the next tactic state. -/
+ isRemoved? : Option Bool := none
+ deriving RpcEncodable
+
+-- duplicated with custom `InteractiveGoalCore`
+@[inherit_doc Lean.Widget.InteractiveTermGoal]
+structure InteractiveTermGoal extends InteractiveGoalCore where
+ /-- Syntactic range of the term. -/
+ range : Lsp.Range
+ /-- Information about the term whose type is the term-mode goal. -/
+ term : WithRpcRef Elab.TermInfo
+ deriving RpcEncodable
-- duplicated with custom `InteractiveGoalCore`
-- @[inherit_doc Lean.Widget.InteractiveGoalCore.pretty]
@@ -82,22 +129,14 @@ def addInteractiveHypothesisBundle (hyps : Array InteractiveHypothesisBundle)
val? := (← value?.mapM ppExprTagged)
isInstance? := if (← isClass? type).isSome then true else none
isType? := if (← instantiateMVars type).isSort then true else none
- -- Added:
+ -- (GameServer) Added:
isAssumption? := if (← inferType type).isProp then true else none
}
-open Meta in
-variable [MonadControlT MetaM n] [Monad n] [MonadError n] [MonadOptions n] [MonadMCtx n] in
-def withGoalCtx (goal : MVarId) (action : LocalContext → MetavarDecl → n α) : n α := do
- let mctx ← getMCtx
- let some mvarDecl := mctx.findDecl? goal
- | throwError "unknown goal {goal.name}"
- let lctx := mvarDecl.lctx |>.sanitizeNames.run' {options := (← getOptions)}
- withLCtx lctx mvarDecl.localInstances (action lctx mvarDecl)
-
-open Meta in
+-- `withGoalCtx` seems to be unmodified
-- Duplicated from `Lean.Widget.goalToInteractive` with custom structures
+open Meta in
@[inherit_doc Lean.Widget.goalToInteractive]
def goalToInteractive (mvarId : MVarId) : MetaM InteractiveGoal := do
let ppAuxDecls := pp.auxDecls.get (← getOptions)
@@ -152,4 +191,4 @@ def goalToInteractive (mvarId : MVarId) : MetaM InteractiveGoal := do
mvarId
}
-end GameServer
+end GameServer.Widget
diff --git a/server/GameServerExe/Widget/InteractiveGoalWithHints.lean b/server/GameServerExe/Widget/InteractiveGoalWithHints.lean
new file mode 100644
index 00000000..a5dc6a60
--- /dev/null
+++ b/server/GameServerExe/Widget/InteractiveGoalWithHints.lean
@@ -0,0 +1,43 @@
+import Lean.Widget.InteractiveDiagnostic
+import GameServerExe.Widget.InteractiveGoal
+
+namespace GameServer
+
+open Lean Server
+
+/-- A hint in the game at the corresponding goal. -/
+structure GameHint where
+ /-- The text with the variable names already inserted.
+
+ Note: This is in theory superfluous and will be completely replaced by `rawText`. We just left
+ it in for debugging for now. -/
+ text : String
+ /-- Flag whether the hint should be hidden initially. -/
+ hidden : Bool
+ /-- The text with the variables not inserted yet. -/
+ rawText : String
+ /-- The assignment of variable names in the `rawText` to the ones the player used. -/
+ varNames : Array <| Name × Name
+deriving FromJson, ToJson
+
+namespace Widget
+
+/-- Bundled `InteractiveGoal` together with an array of hints that apply at this stage. -/
+structure InteractiveGoalWithHints where
+ goal : InteractiveGoal
+ /-- Extended the `InteractiveGoal` by an array of hints at that goal. -/
+ hints : Array GameHint
+deriving RpcEncodable
+
+structure InteractiveGoalsWithHints where
+ goals : Array InteractiveGoalWithHints
+ /-- The content of the line evaluated. -/
+ command : String
+ diags : Array Widget.InteractiveDiagnostic := default
+ line : Option Nat -- only for debugging
+ column : Option Nat -- only for debugging
+deriving RpcEncodable
+
+instance : Inhabited InteractiveGoalsWithHints := ⟨default, default, default, none, none⟩
+
+end GameServer.Widget
diff --git a/server/TestGame.lean b/server/TestGame.lean
new file mode 100644
index 00000000..1f483e5c
--- /dev/null
+++ b/server/TestGame.lean
@@ -0,0 +1,35 @@
+import TestGame.Levels.DemoWorld1
+import TestGame.Levels.DemoWorld2
+
+-- Here's what we'll put on the title screen
+Title "Test Game"
+Introduction
+"
+This text appears on the starting page where one selects the world/level to play.
+You can use markdown.
+"
+
+Info "
+Here you can put additional information about the game. It is accessible
+from the starting through the drop-down menu.
+
+For example: Game version, Credits, Link to Github and Zulip, etc.
+
+Use markdown.
+"
+
+/-! Information to be displayed on the servers landing page. -/
+Languages "en"
+CaptionShort "This game is used for automated tests."
+CaptionLong "It can be accessed at `localhost:3000/#/g/test/Test`."
+Prerequisites "" -- add this if your game depends on other games
+
+/-- warning: Make sure the cover image 'images/nonexistent.png' exists. -/
+#guard_msgs in
+CoverImage "images/nonexistent.png"
+
+CoverImage "images/testGameCover.png"
+
+/-! Build the game. Show's warnings if it found a problem with your game. -/
+
+MakeGame
diff --git a/server/TestGame/Levels/DemoWorld1.lean b/server/TestGame/Levels/DemoWorld1.lean
new file mode 100644
index 00000000..5ce4c8c7
--- /dev/null
+++ b/server/TestGame/Levels/DemoWorld1.lean
@@ -0,0 +1,13 @@
+import TestGame.Levels.DemoWorld1.L01
+import TestGame.Levels.DemoWorld1.L02
+
+World "DemoWorld1"
+Title "Demo World 1"
+
+Introduction "
+This introduction is shown before one enters level 1 of the demo world. Use markdown.
+
+If you add multiple paragraphs...
+
+...the user has to click through them.
+"
diff --git a/server/TestGame/Levels/DemoWorld1/L01.lean b/server/TestGame/Levels/DemoWorld1/L01.lean
new file mode 100644
index 00000000..bfe9c2b6
--- /dev/null
+++ b/server/TestGame/Levels/DemoWorld1/L01.lean
@@ -0,0 +1,29 @@
+import GameServer
+
+World "DemoWorld1"
+Level 1
+
+Title "Hello World"
+
+Introduction "This text is shown as first message when the level is played.
+You can insert hints in the proof below. They will appear in this side panel
+depending on the proof a user provides."
+
+Statement demo_statement (h : x = 2) (g : y = 4) : x + x = y := by
+ Hint "You can either start using `{h}` or `{g}`."
+ Branch
+ rw [g]
+ Hint "You should use `{h}` now."
+ rw [h]
+ rw [h]
+ Hint "You should use `{g}` now."
+ rw [g]
+
+Conclusion "This last message appears if the level is solved."
+
+/- Use these commands to add items to the game's inventory. -/
+
+NewTactic rw rfl
+NewHiddenTactic simp
+-- NewTheorem Nat.add_comm Nat.add_assoc
+-- NewDefinition Nat Add Eq
diff --git a/server/TestGame/Levels/DemoWorld1/L02.lean b/server/TestGame/Levels/DemoWorld1/L02.lean
new file mode 100644
index 00000000..7cf515eb
--- /dev/null
+++ b/server/TestGame/Levels/DemoWorld1/L02.lean
@@ -0,0 +1,22 @@
+import GameServer
+
+World "DemoWorld1"
+Level 2
+
+Title "Hello World"
+
+Introduction "This text is shown as first message when the level is played.
+You can insert hints in the proof below. They will appear in this side panel
+depending on the proof a user provides."
+
+Statement (h : x = 2) (g : y = 4) : x + x = y := by
+ Hint "You can either start using `{h}` or `{g}`."
+ Branch
+ rw [g]
+ Hint "You should use `{h}` now."
+ rw [h]
+ rw [h]
+ Hint "You should use `{g}` now."
+ rw [g]
+
+Conclusion "This last message appears if the level is solved."
diff --git a/server/TestGame/Levels/DemoWorld2.lean b/server/TestGame/Levels/DemoWorld2.lean
new file mode 100644
index 00000000..671554b4
--- /dev/null
+++ b/server/TestGame/Levels/DemoWorld2.lean
@@ -0,0 +1,8 @@
+import TestGame.Levels.DemoWorld2.L01_HelloWorld
+
+World "DemoWorld2"
+Title "Demo World 2"
+
+Introduction "
+This introduction is shown before one enters level 1 of the demo world. Use markdown.
+"
diff --git a/server/TestGame/Levels/DemoWorld2/L01_HelloWorld.lean b/server/TestGame/Levels/DemoWorld2/L01_HelloWorld.lean
new file mode 100644
index 00000000..d73d53d2
--- /dev/null
+++ b/server/TestGame/Levels/DemoWorld2/L01_HelloWorld.lean
@@ -0,0 +1,18 @@
+import GameServer
+import TestGame.Levels.DemoWorld1
+
+World "DemoWorld2"
+Level 1
+
+Title "Hello World"
+
+Introduction "This text is shown as first message when the level is played.
+You can insert hints in the proof below. They will appear in this side panel
+depending on the proof a user provides."
+
+Statement (h : x = 2) (g : y = 4) : x + x = y := by
+ exact demo_statement h g
+
+NewTactic exact
+
+Conclusion "This last message appears if the level is solved."
diff --git a/server/images/testGameCover.png b/server/images/testGameCover.png
new file mode 100644
index 00000000..17e3761c
Binary files /dev/null and b/server/images/testGameCover.png differ
diff --git a/server/lake-manifest.json b/server/lake-manifest.json
index 011a2fae..3b23980f 100644
--- a/server/lake-manifest.json
+++ b/server/lake-manifest.json
@@ -1,41 +1,45 @@
-{"version": 7,
+{"version": "1.1.0",
"packagesDir": ".lake/packages",
"packages":
- [{"url": "https://github.com/leanprover/std4.git",
+ [{"url": "https://github.com/leanprover-community/import-graph",
"type": "git",
"subDir": null,
- "rev": "32983874c1b897d78f20d620fe92fc8fd3f06c3a",
- "name": "std",
+ "scope": "leanprover-community",
+ "rev": "0447b0a7b7f41f0a1749010db3f222e4a96f9d30",
+ "name": "importGraph",
"manifestFile": "lake-manifest.json",
- "inputRev": "v4.7.0",
+ "inputRev": "v4.17.0",
"inherited": false,
- "configFile": "lakefile.lean"},
- {"url": "https://github.com/mhuisi/lean4-cli",
+ "configFile": "lakefile.toml"},
+ {"url": "https://github.com/leanprover-community/batteries",
"type": "git",
"subDir": null,
- "rev": "39229f3630d734af7d9cfb5937ddc6b41d3aa6aa",
- "name": "Cli",
+ "scope": "leanprover-community",
+ "rev": "efcc7d9bd9936ecdc625baf0d033b60866565cd5",
+ "name": "batteries",
"manifestFile": "lake-manifest.json",
- "inputRev": "nightly",
- "inherited": true,
- "configFile": "lakefile.lean"},
- {"url": "https://github.com/hhu-adam/lean-i18n.git",
+ "inputRev": "v4.17.0",
+ "inherited": false,
+ "configFile": "lakefile.toml"},
+ {"url": "https://github.com/hhu-adam/lean-i18n",
"type": "git",
"subDir": null,
- "rev": "7550f08140c59c9a604bbcc23ab7830c103a3e39",
+ "scope": "hhu-adam",
+ "rev": "4c7ecf767e5e88dee425caa82185f414629dd770",
"name": "i18n",
"manifestFile": "lake-manifest.json",
- "inputRev": "v4.7.0",
+ "inputRev": "v4.17.0",
"inherited": false,
"configFile": "lakefile.lean"},
- {"url": "https://github.com/leanprover-community/import-graph",
+ {"url": "https://github.com/leanprover/lean4-cli",
"type": "git",
"subDir": null,
- "rev": "ac07367cbdd57440e6fe78e5be13b41f9cb0f896",
- "name": "importGraph",
+ "scope": "leanprover",
+ "rev": "e7fd1a415c80985ade02a021172834ca2139b0ca",
+ "name": "Cli",
"manifestFile": "lake-manifest.json",
- "inputRev": "v4.7.0",
- "inherited": false,
- "configFile": "lakefile.lean"}],
+ "inputRev": "main",
+ "inherited": true,
+ "configFile": "lakefile.toml"}],
"name": "GameServer",
"lakeDir": ".lake"}
diff --git a/server/lakefile.lean b/server/lakefile.lean
index bf56c166..5f31de1b 100644
--- a/server/lakefile.lean
+++ b/server/lakefile.lean
@@ -6,20 +6,24 @@ package GameServer
-- Using this assumes that each dependency has a tag of the form `v4.X.0`.
def leanVersion : String := s!"v{Lean.versionString}"
-require std from git "https://github.com/leanprover/std4.git" @ leanVersion
-require i18n from git "https://github.com/hhu-adam/lean-i18n.git" @ leanVersion
-
-require importGraph from git "https://github.com/leanprover-community/import-graph" @ leanVersion
-
+require "hhu-adam" / i18n @ git leanVersion
+require "leanprover-community" / batteries @ git leanVersion
+require "leanprover-community" / importGraph @ git leanVersion
+@[default_target]
lean_lib GameServer
+lean_lib GameServerExe
+
@[default_target]
lean_exe gameserver {
- root := `GameServer
+ root := `GameServerExe
supportInterpreter := true
}
+@[test_driver]
+lean_lib TestGame
+
/--
When a package depending on GameServer updates its dependencies,
build the `gameserver` executable.
@@ -28,4 +32,4 @@ post_update pkg do
let rootPkg ← getRootPackage
if rootPkg.name = pkg.name then
return -- do not run in GameServer itself
- discard <| runBuild gameserver.build >>= (·.await)
+ discard <| runBuild gameserver.fetch
diff --git a/server/lean-toolchain b/server/lean-toolchain
index 9ad30404..5499a246 100644
--- a/server/lean-toolchain
+++ b/server/lean-toolchain
@@ -1 +1 @@
-leanprover/lean4:v4.7.0
+leanprover/lean4:v4.17.0
diff --git a/server/test/findLoop.lean b/server/test/findLoop.lean
index b1494f49..94e1462b 100644
--- a/server/test/findLoop.lean
+++ b/server/test/findLoop.lean
@@ -1,18 +1,25 @@
-import GameServer.Commands
+import GameServer
-open Lean
+namespace GameServer
+
+open Lean hiding HashMap HashSet
+open Std
-- E → A → B → C → A and
-- F → G → F
open HashMap in
def testArrows : HashMap Name (HashSet Name) :=
- ofList [("a", (HashSet.empty.insert "b": HashSet Name).insert "d"),
- ("b", (HashSet.empty.insert "c": HashSet Name)),
- ("c", (HashSet.empty.insert "a": HashSet Name)),
- ("d", {}),
- ("f", (HashSet.empty.insert "g": HashSet Name)),
- ("g", (HashSet.empty.insert "f": HashSet Name)),
- ("e", (HashSet.empty.insert "a": HashSet Name).insert "f")]
+ ofList [(`a, (HashSet.empty.insert `b : HashSet Name).insert `d),
+ (`b, (HashSet.empty.insert `c : HashSet Name)),
+ (`c, (HashSet.empty.insert `a : HashSet Name)),
+ (`d, {}),
+ (`f, (HashSet.empty.insert `g : HashSet Name)),
+ (`g, (HashSet.empty.insert `f : HashSet Name)),
+ (`e, (HashSet.empty.insert `a : HashSet Name).insert `f)]
--- some permutation of ``[`c, `a, `b]`` or ``[`f, `g]``
+/--
+info: [`a, `b, `c]
+-/
+#guard_msgs in
+-- expected: some permutation of ``[`c, `a, `b]`` or ``[`f, `g]``
#eval findLoops testArrows
diff --git a/server/test/tactic_docstring_test.lean b/server/test/tactic_docstring_test.lean
index d285c856..d6df3140 100644
--- a/server/test/tactic_docstring_test.lean
+++ b/server/test/tactic_docstring_test.lean
@@ -49,13 +49,16 @@ def getTacticDocstring (name: Name) : CommandElabM String := do
m!"using `TacticDoc {name} \"some doc\"`"
return ""
-#eval (getTacticDocstring `simp)
-
+/-- info: "The `simp` tactic" -/
+#guard_msgs in
+#eval do
+ let doc ← (getTacticDocstring `simp)
+ return doc.take 17
-- TODO: Things we want:
- -- 1) Getting docstring this way is a problem if we want to "reprove" a mathlib lemma because
+ -- 1) Getting docstring this way is a problem if we want to "reprove" a mathlib theorem because
-- either it would not be imported from mathlib or have a different name in `Statement`
- -- 3) is the lemma a simp lemma? (are there other attributes on it? --> hard/impossible)
+ -- 3) is the theorem a simp theorem? (are there other attributes on it? --> hard/impossible)
-- 4) which mathlib file is it imported from?
-- 5) namespace
-- 6) tactics: are there alternative variations like `ext`, `ext?`, `ext1?`, …
diff --git a/server/test/test_statement.lean b/server/test/test_statement.lean
index 196d1b72..940e7b45 100644
--- a/server/test/test_statement.lean
+++ b/server/test/test_statement.lean
@@ -1,4 +1,4 @@
-import GameServer.Commands
+import GameServer
--import
Game "Test"
@@ -9,6 +9,11 @@ Level 1
-- Shows info on `foo.bar`:
+/--
+info: Missing Theorem Documentation: foo.bar, used default (e.g. provided docstring) instead. If you want to write a different description, add `TheoremDoc foo.bar` somewhere above this statement.
+-/
+#guard_msgs in
+
/-- some text -/
Statement foo.bar : 5 ≤ 7 := by
simp
@@ -17,12 +22,27 @@ Game "Test"
World "TestW"
Level 2 -- should warn if set to `1`
+/--
+warning: Missing Theorem Documentation: foo.bar2
+Add `TheoremDoc foo.bar2` somewhere above this statement.
+-/
+#guard_msgs in
+
-- Shows warning on `foo.bar₂`:
Statement foo.bar2 : 3 ≤ 7 := by
simp
-NewLemma foo.bar
+NewTheorem foo.bar
+
+/--
+warning: Could not find a docstring for tactic tauto, consider adding one using `TacticDoc tauto "some doc"`
+---
+warning: Missing Tactic Documentation: tauto
+Add `TacticDoc tauto` somewhere above this statement.
+-/
+#guard_msgs in
+
DisabledTactic tauto
@@ -31,6 +51,11 @@ DisabledTactic tauto
-- test that the command also works inside a namespace
namespace myNamespace
+/--
+info: Missing Theorem Documentation: myNamespace.anotherStatement, used default (e.g. provided docstring) instead. If you want to write a different description, add `TheoremDoc myNamespace.anotherStatement` somewhere above this statement.
+-/
+#guard_msgs in
+
/-- test -/
Statement anotherStatement (n : Nat) : n + 0 = n := by
rfl
@@ -39,7 +64,19 @@ end myNamespace
/- Other tests -/
-LemmaDoc add_zero as "add_zero" in "Nat" "(nothing)"
+/--
+warning: You should use the new Syntax:
+
+ /-- yada yada -/
+ YourCommand
+
+ instead of
+
+ YourCommand "yada yada"
+-/
+#guard_msgs in
+
+TheoremDoc add_zero as "add_zero" in "Nat" "(nothing)"
/-- test -/
Statement add_zero (n : Nat) : n + 0 = n := by
@@ -58,10 +95,21 @@ Statement (n : Nat) : 0 + n = n := by
simp
-NewLemma add_zero
+/--
+warning: You should only use one `NewTheorem` per level, but it can take multiple arguments: `{cmd} obj₁ obj₂ obj₃`!
+-/
+#guard_msgs in
+
+NewTheorem add_zero
--attribute [simp] add_zero
+/--
+info: theorem add_zero : ∀ (n : Nat), n + 0 = n :=
+fun n => Eq.refl (n + 0)
+-/
+#guard_msgs in
+
#print add_zero
theorem xy (n : Nat) : n + 0 = n := by
@@ -71,6 +119,11 @@ theorem xy (n : Nat) : n + 0 = n := by
/-! Test that it is possible to add `simp` attribute. -/
+/--
+info: Missing Theorem Documentation: My.add_assoc, used default (e.g. provided docstring) instead. If you want to write a different description, add `TheoremDoc My.add_assoc` somewhere above this statement.
+-/
+#guard_msgs in
+
/-- Doc comment -/
@[simp]
Statement My.add_assoc (n m x : Nat) : (m + n) + x = m + (n + x) := by
@@ -79,7 +132,16 @@ Statement My.add_assoc (n m x : Nat) : (m + n) + x = m + (n + x) := by
example (n m : Nat) : (m + n) + x = m + (n + x) := by
simp
+/-- info: My.add_assoc (n m x : Nat) : m + n + x = m + (n + x) -/
+#guard_msgs in
+
#check My.add_assoc
+/--
+warning: Missing Theorem Documentation: My.add_comm
+Add `TheoremDoc My.add_comm` somewhere above this statement.
+-/
+#guard_msgs in
+
Statement My.add_comm (preamble := simp [add_comm m n]) (n m : Nat) : n + (m + 0) = m + n := by
rw [Nat.add_comm]
diff --git a/tsconfig.json b/tsconfig.json
index e847c343..6d124185 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -13,8 +13,29 @@
"allowSyntheticDefaultImports": true,
"lib": [
"ES2021.String",
- "DOM"
- ]
+ "DOM",
+ "DOM.Iterable"
+ ],
+ "skipLibCheck": true,
+
+ /* Bundler mode */
+ // "moduleResolution": "bundler",
+ "allowImportingTsExtensions": true,
+ "isolatedModules": true,
+ "moduleDetection": "force",
+ "noEmit": true,
+
+ /* Linting */
+ // "strict": true,
+ // "noUnusedLocals": true,
+ // "noUnusedParameters": true,
+ // "noFallthroughCasesInSwitch": true
+
+ // "allowJs": true,
+ // "esModuleInterop": true,
+ // "downlevelIteration": true,
+ // "experimentalDecorators": true,
+ // "allowSyntheticDefaultImports": true,
},
"references": [{"path": "./relay"}, {"path": "./client"}],
"exclude": ["./server/"]
diff --git a/vite.config.ts b/vite.config.ts
index bfffed9b..43bedddc 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -2,39 +2,60 @@ import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react-swc'
import { viteStaticCopy } from 'vite-plugin-static-copy'
import svgr from "vite-plugin-svgr"
+import { nodePolyfills } from 'vite-plugin-node-polyfills'
+import importMetaUrlPlugin from '@codingame/esbuild-import-meta-url-plugin'
+import { normalizePath } from 'vite'
+import path from 'node:path'
const backendPort = process.env.PORT || 8080;
const clientPort = process.env.CLIENT_PORT || 3000;
// https://vitejs.dev/config/
export default defineConfig({
- //root: 'client/src',
+ optimizeDeps: {
+ esbuildOptions: {
+ plugins: [importMetaUrlPlugin]
+ },
+ exclude: ['games']
+ },
build: {
// Relative to the root
- // Note: This has to match the path in `relay/index.mjs`
+ // Note: This has to match the path in `relay/index.mjs` and in `tsconfig.json`
outDir: 'client/dist',
},
plugins: [
react(),
svgr({
- svgrOptions: {
- // svgr options
+ // svgr options: https://react-svgr.com/docs/options/
+ svgrOptions: { exportType: "default", ref: true, svgo: false, titleProp: true },
+ include: "**/*.svg",
+ }),
+ nodePolyfills({
+ overrides: {
+ fs: 'memfs',
},
}),
viteStaticCopy({
targets: [
{
- src: 'node_modules/@leanprover/infoview/dist/*.production.min.js',
- dest: '.'
+ src: [
+ normalizePath(path.resolve(__dirname, './node_modules/@leanprover/infoview/dist/*')),
+ normalizePath(path.resolve(__dirname, './node_modules/lean4monaco/dist/webview/webview.js')),
+ ],
+ dest: 'infoview'
+ },
+ {
+ src: [
+ normalizePath(path.resolve(__dirname, './node_modules/@leanprover/infoview/dist/codicon.ttf'))
+ ],
+ dest: 'assets'
}
]
})
],
publicDir: "client/public",
- base: "/", // setting this to `/leangame/` means the server is now accessible at `localhost:3000/leangame`
- optimizeDeps: {
- exclude: ['games']
- },
+ base: "/", // setting this to `/leanweb/` means the server is now accessible at `localhost:3000/leanweb`
+ //root: 'client/src',
server: {
port: Number(clientPort),
proxy: {