From 696ba31be804d5334afbd695189ae13f351ff652 Mon Sep 17 00:00:00 2001 From: Weiyi Feng Date: Sun, 24 Apr 2022 16:59:56 +0800 Subject: [PATCH] config_tools: refactor configurator for web page cache issue refactor configurator for web page cache issue Tracked-On: #7356 Signed-off-by: Weiyi Feng --- .gitignore | 4 +- misc/config_tools/MANIFEST.in | 4 + misc/config_tools/build.cmd | 9 + misc/config_tools/configurator/.gitignore | 4 - misc/config_tools/configurator/README.md | 23 +- .../{src/lib/common.js => __init__.py} | 0 misc/config_tools/configurator/index.html | 32 +- misc/config_tools/configurator/package.json | 38 +- .../configurator/public/favicon.ico | Bin 0 -> 4286 bytes .../configurator/pyodide/README.md | 27 + .../configurator/pyodide/__init__.py | 1 + .../pyodide/generateLaunchScript.py | 51 + .../configurator/pyodide/loadBoard.py | 98 + .../configurator/pyodide/loadScenario.py | 78 + .../configurator/pyodide/pyodide.py | 60 + .../configurator/pyodide/tests.py | 22 + .../configurator/pyodide/validateScenario.py | 54 + .../configurator/requirements.txt | 8 +- .../configurator/src-tauri/.gitignore | 10 - .../configurator/src-tauri/Cargo.lock | 1069 +++++------ .../configurator/src-tauri/Cargo.toml | 13 +- .../src-tauri/src/configurator.rs | 82 +- .../configurator/src-tauri/src/filesystem.rs | 102 -- .../configurator/src-tauri/src/main.rs | 72 +- .../configurator/src-tauri/tauri.conf.json | 1 + .../configurator/src-tauri/tauri.json | 12 +- .../configurator/src/ACRNContext.jsx | 37 - misc/config_tools/configurator/src/App.css | 97 - misc/config_tools/configurator/src/App.jsx | 25 - misc/config_tools/configurator/src/App.vue | 24 + .../configurator/src/assets/css/index.scss | 183 ++ .../src/assets/fonts/Roboto-Regular.woff | Bin 68404 -> 0 bytes .../src/assets/fonts/Roboto-Regular.woff2 | Bin 49860 -> 0 bytes .../configurator/src/assets/fonts/Roboto.css | 9 - .../Navbar => assets}/images/ACRN_Logo.svg | 0 .../TabAdd/assets => assets/images}/Plus.svg | 0 .../Banner => assets}/images/top_pattern.png | Bin .../src/assets/schema/dynamicScenario.py | 78 - .../src/components/Banner/Banner.css | 6 - .../src/components/Banner/Banner.jsx | 9 - .../src/components/Banner/index.jsx | 5 - .../src/components/Confirm/Confirm.jsx | 45 - .../src/components/Confirm/index.jsx | 3 - .../src/components/Footer/footer.jsx | 25 - .../src/components/Footer/index.jsx | 3 - .../src/components/HelloWorld.vue | 21 + .../src/components/Navbar/Navbar.css | 44 - .../src/components/Navbar/Navbar.jsx | 39 - .../src/components/Navbar/index.jsx | 5 - .../src/components/common/Banner.vue | 21 + .../src/components/common/ControlBar.vue | 96 + .../src/components/common/Footer.vue | 39 + .../config_tools/configurator/src/favicon.svg | 15 - misc/config_tools/configurator/src/index.scss | 36 - .../configurator/src/lib/.gitignore | 2 - .../configurator/src/lib/acrn.jsx | 503 ----- .../config_tools/configurator/src/lib/acrn.ts | 144 ++ .../configurator/src/lib/bs4rjsf/.gitignore | 2 - .../src/lib/bs4rjsf/AddButton/AddButton.tsx | 13 - .../src/lib/bs4rjsf/AddButton/index.ts | 2 - .../ArrayFieldTemplate/ArrayFieldTemplate.tsx | 210 --- .../lib/bs4rjsf/ArrayFieldTemplate/index.ts | 2 - .../bs4rjsf/CheckboxWidget/CheckboxWidget.tsx | 50 - .../src/lib/bs4rjsf/CheckboxWidget/index.ts | 2 - .../CheckboxesWidget/CheckboxesWidget.tsx | 103 -- .../src/lib/bs4rjsf/CheckboxesWidget/index.ts | 2 - .../lib/bs4rjsf/ColorWidget/ColorWidget.tsx | 10 - .../src/lib/bs4rjsf/ColorWidget/index.ts | 2 - .../bs4rjsf/DateTimeWidget/DateTimeWidget.tsx | 24 - .../src/lib/bs4rjsf/DateTimeWidget/index.ts | 2 - .../src/lib/bs4rjsf/DateWidget/DateWidget.tsx | 15 - .../src/lib/bs4rjsf/DateWidget/index.ts | 2 - .../DescriptionField/DescriptionField.tsx | 18 - .../src/lib/bs4rjsf/DescriptionField/index.ts | 2 - .../lib/bs4rjsf/EmailWidget/EmailWidget.tsx | 10 - .../src/lib/bs4rjsf/EmailWidget/index.ts | 2 - .../src/lib/bs4rjsf/ErrorList/ErrorList.tsx | 25 - .../src/lib/bs4rjsf/ErrorList/index.ts | 2 - .../bs4rjsf/FieldTemplate/FieldTemplate.tsx | 171 -- .../FieldTemplate/WrapIfAdditional.tsx | 83 - .../src/lib/bs4rjsf/FieldTemplate/index.ts | 2 - .../src/lib/bs4rjsf/Fields/Fields.ts | 7 - .../src/lib/bs4rjsf/Fields/index.ts | 2 - .../src/lib/bs4rjsf/FileWidget/FileWidget.tsx | 10 - .../src/lib/bs4rjsf/FileWidget/index.ts | 2 - .../src/lib/bs4rjsf/Form/Form.tsx | 10 - .../src/lib/bs4rjsf/Form/index.ts | 2 - .../src/lib/bs4rjsf/IconButton/IconButton.tsx | 33 - .../src/lib/bs4rjsf/IconButton/index.ts | 2 - .../ObjectFieldTemplate.tsx | 81 - .../lib/bs4rjsf/ObjectFieldTemplate/index.ts | 2 - .../bs4rjsf/PasswordWidget/PasswordWidget.tsx | 55 - .../src/lib/bs4rjsf/PasswordWidget/index.ts | 2 - .../lib/bs4rjsf/RadioWidget/RadioWidget.tsx | 70 - .../src/lib/bs4rjsf/RadioWidget/index.ts | 2 - .../lib/bs4rjsf/RangeWidget/RangeWidget.tsx | 57 - .../src/lib/bs4rjsf/RangeWidget/index.ts | 2 - .../lib/bs4rjsf/SelectWidget/SelectWidget.tsx | 132 -- .../src/lib/bs4rjsf/SelectWidget/index.ts | 2 - .../src/lib/bs4rjsf/TextWidget/TextWidget.tsx | 74 - .../src/lib/bs4rjsf/TextWidget/index.ts | 2 - .../bs4rjsf/TextareaWidget/TextareaWidget.tsx | 71 - .../src/lib/bs4rjsf/TextareaWidget/index.ts | 2 - .../src/lib/bs4rjsf/Theme/Theme.tsx | 37 - .../src/lib/bs4rjsf/Theme/index.ts | 2 - .../src/lib/bs4rjsf/TitleField/TitleField.tsx | 17 - .../src/lib/bs4rjsf/TitleField/index.ts | 2 - .../src/lib/bs4rjsf/URLWidget/URLWidget.tsx | 10 - .../src/lib/bs4rjsf/URLWidget/index.ts | 2 - .../lib/bs4rjsf/UpDownWidget/UpDownWidget.tsx | 52 - .../src/lib/bs4rjsf/UpDownWidget/index.ts | 2 - .../src/lib/bs4rjsf/Widgets/Widgets.ts | 33 - .../src/lib/bs4rjsf/Widgets/index.ts | 2 - .../configurator/src/lib/bs4rjsf/index.ts | 10 - .../configurator/src/lib/helper.jsx | 221 --- .../src/lib/{json2xml.jsx => json2xml.js} | 0 .../src/lib/platform/tauri/tauri.jsx | 22 - .../configurator/src/lib/runpy.jsx | 58 - .../configurator/src/lib/xml2json.js | 191 -- misc/config_tools/configurator/src/logo.svg | 7 - misc/config_tools/configurator/src/main.js | 102 ++ misc/config_tools/configurator/src/main.jsx | 25 - .../configurator/src/pages/Config.vue | 228 +++ .../configurator/src/pages/Config/Board.vue | 144 ++ .../configurator/src/pages/Config/Config.css | 8 - .../configurator/src/pages/Config/Config.jsx | 67 - .../pages/Config/ConfigForm/ConfigForm.vue | 152 ++ .../src/pages/Config/ConfigForm/TabBox.vue | 132 ++ .../ConfigForm/ConfigForm.css | 10 - .../ConfigForm/ConfigForm.jsx | 150 -- .../CustomTemplateField.js | 30 - .../CustomTemplateField.js.map | 1 - .../CustomTemplateField.tsx | 97 - .../CustomTemplateField/WrapIfAdditional.js | 30 - .../WrapIfAdditional.js.map | 1 - .../CustomTemplateField/WrapIfAdditional.tsx | 85 - .../IVSHMEM_VM/SelectWidget/SelectWidget.tsx | 130 -- .../IVSHMEM_VM/SelectWidget/index.ts | 2 - .../IVSHMEM_VM/TextWidget/TextWidget.tsx | 72 - .../ConfigForm/IVSHMEM_VM/TextWidget/index.ts | 2 - .../ConfigForm/index.jsx | 5 - .../ConfigTabBar/ConfigTabBar.css | 12 - .../ConfigTabBar/ConfigTabBar.jsx | 84 - .../ConfigTabBar/Tab/Tab.css | 17 - .../ConfigTabBar/Tab/Tab.jsx | 22 - .../ConfigTabBar/Tab/index.jsx | 3 - .../ConfigTabBar/TabAdd/TabAdd.css | 4 - .../ConfigTabBar/TabAdd/TabAdd.jsx | 12 - .../ConfigTabBar/TabAdd/index.jsx | 3 - .../ConfigTabBar/TabSplitter/TabSplitter.css | 6 - .../ConfigTabBar/TabSplitter/TabSplitter.jsx | 10 - .../ConfigTabBar/TabSplitter/index.jsx | 3 - .../ConfigTabBar/index.jsx | 0 .../ConfigureSettingsForScenario.css | 55 - .../ConfigureSettingsForScenario.jsx | 108 -- .../ConfigureSettingsForScenario/index.jsx | 3 - .../CreateNewOrImportAnExistingScenario.jsx | 158 -- .../CreateScenarioModal.css | 17 - .../CreateScenarioModal.jsx | 128 -- .../CreateScenarioModal/index.jsx | 3 - .../index.jsx | 3 - .../ExitACRNConfigurationModal.jsx | 63 - .../ImportABoardConfigurationFile.jsx | 179 -- .../ImportABoardConfigurationFile/index.jsx | 3 - .../src/pages/Config/Scenario.vue | 112 ++ .../src/pages/Config/Scenario/NewScenario.vue | 131 ++ .../configurator/src/pages/Error/Error.jsx | 15 - .../src/pages/Error/MyErrorBoundary.jsx | 23 - .../configurator/src/pages/Welcome.vue | 43 + .../ExitACRNConfigurationModal.jsx | 41 - .../src/pages/Welcome/NewConfiguration.vue | 104 ++ .../StartNewConfigurationPanel.jsx | 138 -- .../StartNewConfigurationPanel/index.jsx | 3 - .../UseAnExistingConfigurationPanel.jsx | 123 -- .../UseAnExistingConfigurationPanel/index.jsx | 3 - .../src/pages/Welcome/UseExisting.vue | 89 + .../src/pages/Welcome/Welcome.css | 8 - .../src/pages/Welcome/Welcome.jsx | 53 - .../configurator/src/plugin/text-plugin.js | 17 - .../src/plugin/text-plugin.js.map | 1 - .../configurator/src/plugin/text-plugin.ts | 24 - misc/config_tools/configurator/src/router.js | 15 + .../configurator/thirdLib/.gitignore | 2 + .../configurator/thirdLib/library.json | 129 ++ .../configurator/thirdLib/manager.py | 125 ++ .../{src/plugin => thirdLib}/tauri-plugin.ts | 60 +- misc/config_tools/configurator/tsconfig.json | 2 +- misc/config_tools/configurator/vite.config.js | 9 +- misc/config_tools/configurator/yarn.lock | 1622 +++++++---------- misc/config_tools/data/__init__.py | 3 + misc/config_tools/launch_config/__init__.py | 3 + .../launch_config/launch_cfg_gen.py | 41 +- .../scenario_config/jsonschema/converter.py | 89 +- .../scenario_config/jsonschema/document.py | 30 +- .../scenario_config/schema_slicer.py | 5 +- misc/config_tools/schema/__init__.py | 3 + misc/config_tools/schema/config.xsd | 2 +- misc/config_tools/setup.cfg | 7 + misc/packaging/gen_acrn_deb.py | 5 +- 199 files changed, 3838 insertions(+), 7045 deletions(-) create mode 100644 misc/config_tools/MANIFEST.in create mode 100644 misc/config_tools/build.cmd rename misc/config_tools/configurator/{src/lib/common.js => __init__.py} (100%) create mode 100644 misc/config_tools/configurator/public/favicon.ico create mode 100644 misc/config_tools/configurator/pyodide/README.md create mode 100644 misc/config_tools/configurator/pyodide/__init__.py create mode 100644 misc/config_tools/configurator/pyodide/generateLaunchScript.py create mode 100644 misc/config_tools/configurator/pyodide/loadBoard.py create mode 100644 misc/config_tools/configurator/pyodide/loadScenario.py create mode 100644 misc/config_tools/configurator/pyodide/pyodide.py create mode 100644 misc/config_tools/configurator/pyodide/tests.py create mode 100644 misc/config_tools/configurator/pyodide/validateScenario.py delete mode 100644 misc/config_tools/configurator/src-tauri/src/filesystem.rs create mode 100644 misc/config_tools/configurator/src-tauri/tauri.conf.json delete mode 100644 misc/config_tools/configurator/src/ACRNContext.jsx delete mode 100644 misc/config_tools/configurator/src/App.css delete mode 100644 misc/config_tools/configurator/src/App.jsx create mode 100644 misc/config_tools/configurator/src/App.vue create mode 100644 misc/config_tools/configurator/src/assets/css/index.scss delete mode 100644 misc/config_tools/configurator/src/assets/fonts/Roboto-Regular.woff delete mode 100644 misc/config_tools/configurator/src/assets/fonts/Roboto-Regular.woff2 delete mode 100644 misc/config_tools/configurator/src/assets/fonts/Roboto.css rename misc/config_tools/configurator/src/{components/Navbar => assets}/images/ACRN_Logo.svg (100%) rename misc/config_tools/configurator/src/{pages/Config/ConfigureSettingsForScenario/ConfigTabBar/TabAdd/assets => assets/images}/Plus.svg (100%) rename misc/config_tools/configurator/src/{components/Banner => assets}/images/top_pattern.png (100%) delete mode 100644 misc/config_tools/configurator/src/assets/schema/dynamicScenario.py delete mode 100644 misc/config_tools/configurator/src/components/Banner/Banner.css delete mode 100644 misc/config_tools/configurator/src/components/Banner/Banner.jsx delete mode 100644 misc/config_tools/configurator/src/components/Banner/index.jsx delete mode 100644 misc/config_tools/configurator/src/components/Confirm/Confirm.jsx delete mode 100644 misc/config_tools/configurator/src/components/Confirm/index.jsx delete mode 100644 misc/config_tools/configurator/src/components/Footer/footer.jsx delete mode 100644 misc/config_tools/configurator/src/components/Footer/index.jsx create mode 100644 misc/config_tools/configurator/src/components/HelloWorld.vue delete mode 100644 misc/config_tools/configurator/src/components/Navbar/Navbar.css delete mode 100644 misc/config_tools/configurator/src/components/Navbar/Navbar.jsx delete mode 100644 misc/config_tools/configurator/src/components/Navbar/index.jsx create mode 100644 misc/config_tools/configurator/src/components/common/Banner.vue create mode 100644 misc/config_tools/configurator/src/components/common/ControlBar.vue create mode 100644 misc/config_tools/configurator/src/components/common/Footer.vue delete mode 100644 misc/config_tools/configurator/src/favicon.svg delete mode 100644 misc/config_tools/configurator/src/index.scss delete mode 100644 misc/config_tools/configurator/src/lib/.gitignore delete mode 100644 misc/config_tools/configurator/src/lib/acrn.jsx create mode 100644 misc/config_tools/configurator/src/lib/acrn.ts delete mode 100644 misc/config_tools/configurator/src/lib/bs4rjsf/.gitignore delete mode 100644 misc/config_tools/configurator/src/lib/bs4rjsf/AddButton/AddButton.tsx delete mode 100644 misc/config_tools/configurator/src/lib/bs4rjsf/AddButton/index.ts delete mode 100644 misc/config_tools/configurator/src/lib/bs4rjsf/ArrayFieldTemplate/ArrayFieldTemplate.tsx delete mode 100644 misc/config_tools/configurator/src/lib/bs4rjsf/ArrayFieldTemplate/index.ts delete mode 100644 misc/config_tools/configurator/src/lib/bs4rjsf/CheckboxWidget/CheckboxWidget.tsx delete mode 100644 misc/config_tools/configurator/src/lib/bs4rjsf/CheckboxWidget/index.ts delete mode 100644 misc/config_tools/configurator/src/lib/bs4rjsf/CheckboxesWidget/CheckboxesWidget.tsx delete mode 100644 misc/config_tools/configurator/src/lib/bs4rjsf/CheckboxesWidget/index.ts delete mode 100644 misc/config_tools/configurator/src/lib/bs4rjsf/ColorWidget/ColorWidget.tsx delete mode 100644 misc/config_tools/configurator/src/lib/bs4rjsf/ColorWidget/index.ts delete mode 100644 misc/config_tools/configurator/src/lib/bs4rjsf/DateTimeWidget/DateTimeWidget.tsx delete mode 100644 misc/config_tools/configurator/src/lib/bs4rjsf/DateTimeWidget/index.ts delete mode 100644 misc/config_tools/configurator/src/lib/bs4rjsf/DateWidget/DateWidget.tsx delete mode 100644 misc/config_tools/configurator/src/lib/bs4rjsf/DateWidget/index.ts delete mode 100644 misc/config_tools/configurator/src/lib/bs4rjsf/DescriptionField/DescriptionField.tsx delete mode 100644 misc/config_tools/configurator/src/lib/bs4rjsf/DescriptionField/index.ts delete mode 100644 misc/config_tools/configurator/src/lib/bs4rjsf/EmailWidget/EmailWidget.tsx delete mode 100644 misc/config_tools/configurator/src/lib/bs4rjsf/EmailWidget/index.ts delete mode 100644 misc/config_tools/configurator/src/lib/bs4rjsf/ErrorList/ErrorList.tsx delete mode 100644 misc/config_tools/configurator/src/lib/bs4rjsf/ErrorList/index.ts delete mode 100644 misc/config_tools/configurator/src/lib/bs4rjsf/FieldTemplate/FieldTemplate.tsx delete mode 100644 misc/config_tools/configurator/src/lib/bs4rjsf/FieldTemplate/WrapIfAdditional.tsx delete mode 100644 misc/config_tools/configurator/src/lib/bs4rjsf/FieldTemplate/index.ts delete mode 100644 misc/config_tools/configurator/src/lib/bs4rjsf/Fields/Fields.ts delete mode 100644 misc/config_tools/configurator/src/lib/bs4rjsf/Fields/index.ts delete mode 100644 misc/config_tools/configurator/src/lib/bs4rjsf/FileWidget/FileWidget.tsx delete mode 100644 misc/config_tools/configurator/src/lib/bs4rjsf/FileWidget/index.ts delete mode 100644 misc/config_tools/configurator/src/lib/bs4rjsf/Form/Form.tsx delete mode 100644 misc/config_tools/configurator/src/lib/bs4rjsf/Form/index.ts delete mode 100644 misc/config_tools/configurator/src/lib/bs4rjsf/IconButton/IconButton.tsx delete mode 100644 misc/config_tools/configurator/src/lib/bs4rjsf/IconButton/index.ts delete mode 100644 misc/config_tools/configurator/src/lib/bs4rjsf/ObjectFieldTemplate/ObjectFieldTemplate.tsx delete mode 100644 misc/config_tools/configurator/src/lib/bs4rjsf/ObjectFieldTemplate/index.ts delete mode 100644 misc/config_tools/configurator/src/lib/bs4rjsf/PasswordWidget/PasswordWidget.tsx delete mode 100644 misc/config_tools/configurator/src/lib/bs4rjsf/PasswordWidget/index.ts delete mode 100644 misc/config_tools/configurator/src/lib/bs4rjsf/RadioWidget/RadioWidget.tsx delete mode 100644 misc/config_tools/configurator/src/lib/bs4rjsf/RadioWidget/index.ts delete mode 100644 misc/config_tools/configurator/src/lib/bs4rjsf/RangeWidget/RangeWidget.tsx delete mode 100644 misc/config_tools/configurator/src/lib/bs4rjsf/RangeWidget/index.ts delete mode 100644 misc/config_tools/configurator/src/lib/bs4rjsf/SelectWidget/SelectWidget.tsx delete mode 100644 misc/config_tools/configurator/src/lib/bs4rjsf/SelectWidget/index.ts delete mode 100644 misc/config_tools/configurator/src/lib/bs4rjsf/TextWidget/TextWidget.tsx delete mode 100644 misc/config_tools/configurator/src/lib/bs4rjsf/TextWidget/index.ts delete mode 100644 misc/config_tools/configurator/src/lib/bs4rjsf/TextareaWidget/TextareaWidget.tsx delete mode 100644 misc/config_tools/configurator/src/lib/bs4rjsf/TextareaWidget/index.ts delete mode 100644 misc/config_tools/configurator/src/lib/bs4rjsf/Theme/Theme.tsx delete mode 100644 misc/config_tools/configurator/src/lib/bs4rjsf/Theme/index.ts delete mode 100644 misc/config_tools/configurator/src/lib/bs4rjsf/TitleField/TitleField.tsx delete mode 100644 misc/config_tools/configurator/src/lib/bs4rjsf/TitleField/index.ts delete mode 100644 misc/config_tools/configurator/src/lib/bs4rjsf/URLWidget/URLWidget.tsx delete mode 100644 misc/config_tools/configurator/src/lib/bs4rjsf/URLWidget/index.ts delete mode 100644 misc/config_tools/configurator/src/lib/bs4rjsf/UpDownWidget/UpDownWidget.tsx delete mode 100644 misc/config_tools/configurator/src/lib/bs4rjsf/UpDownWidget/index.ts delete mode 100644 misc/config_tools/configurator/src/lib/bs4rjsf/Widgets/Widgets.ts delete mode 100644 misc/config_tools/configurator/src/lib/bs4rjsf/Widgets/index.ts delete mode 100644 misc/config_tools/configurator/src/lib/bs4rjsf/index.ts delete mode 100644 misc/config_tools/configurator/src/lib/helper.jsx rename misc/config_tools/configurator/src/lib/{json2xml.jsx => json2xml.js} (100%) delete mode 100644 misc/config_tools/configurator/src/lib/platform/tauri/tauri.jsx delete mode 100644 misc/config_tools/configurator/src/lib/runpy.jsx delete mode 100644 misc/config_tools/configurator/src/lib/xml2json.js delete mode 100644 misc/config_tools/configurator/src/logo.svg create mode 100644 misc/config_tools/configurator/src/main.js delete mode 100644 misc/config_tools/configurator/src/main.jsx create mode 100644 misc/config_tools/configurator/src/pages/Config.vue create mode 100644 misc/config_tools/configurator/src/pages/Config/Board.vue delete mode 100644 misc/config_tools/configurator/src/pages/Config/Config.css delete mode 100644 misc/config_tools/configurator/src/pages/Config/Config.jsx create mode 100644 misc/config_tools/configurator/src/pages/Config/ConfigForm/ConfigForm.vue create mode 100644 misc/config_tools/configurator/src/pages/Config/ConfigForm/TabBox.vue delete mode 100644 misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigForm/ConfigForm.css delete mode 100644 misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigForm/ConfigForm.jsx delete mode 100644 misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigForm/CustomTemplateField/CustomTemplateField.js delete mode 100644 misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigForm/CustomTemplateField/CustomTemplateField.js.map delete mode 100644 misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigForm/CustomTemplateField/CustomTemplateField.tsx delete mode 100644 misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigForm/CustomTemplateField/WrapIfAdditional.js delete mode 100644 misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigForm/CustomTemplateField/WrapIfAdditional.js.map delete mode 100644 misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigForm/CustomTemplateField/WrapIfAdditional.tsx delete mode 100644 misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigForm/IVSHMEM_VM/SelectWidget/SelectWidget.tsx delete mode 100644 misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigForm/IVSHMEM_VM/SelectWidget/index.ts delete mode 100644 misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigForm/IVSHMEM_VM/TextWidget/TextWidget.tsx delete mode 100644 misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigForm/IVSHMEM_VM/TextWidget/index.ts delete mode 100644 misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigForm/index.jsx delete mode 100644 misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigTabBar/ConfigTabBar.css delete mode 100644 misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigTabBar/ConfigTabBar.jsx delete mode 100644 misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigTabBar/Tab/Tab.css delete mode 100644 misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigTabBar/Tab/Tab.jsx delete mode 100644 misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigTabBar/Tab/index.jsx delete mode 100644 misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigTabBar/TabAdd/TabAdd.css delete mode 100644 misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigTabBar/TabAdd/TabAdd.jsx delete mode 100644 misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigTabBar/TabAdd/index.jsx delete mode 100644 misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigTabBar/TabSplitter/TabSplitter.css delete mode 100644 misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigTabBar/TabSplitter/TabSplitter.jsx delete mode 100644 misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigTabBar/TabSplitter/index.jsx delete mode 100644 misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigTabBar/index.jsx delete mode 100644 misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigureSettingsForScenario.css delete mode 100644 misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigureSettingsForScenario.jsx delete mode 100644 misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/index.jsx delete mode 100644 misc/config_tools/configurator/src/pages/Config/CreateNewOrImportAnExistingScenario/CreateNewOrImportAnExistingScenario.jsx delete mode 100644 misc/config_tools/configurator/src/pages/Config/CreateNewOrImportAnExistingScenario/CreateScenarioModal/CreateScenarioModal.css delete mode 100644 misc/config_tools/configurator/src/pages/Config/CreateNewOrImportAnExistingScenario/CreateScenarioModal/CreateScenarioModal.jsx delete mode 100644 misc/config_tools/configurator/src/pages/Config/CreateNewOrImportAnExistingScenario/CreateScenarioModal/index.jsx delete mode 100644 misc/config_tools/configurator/src/pages/Config/CreateNewOrImportAnExistingScenario/index.jsx delete mode 100644 misc/config_tools/configurator/src/pages/Config/ExitACRNConfigurationModal/ExitACRNConfigurationModal.jsx delete mode 100644 misc/config_tools/configurator/src/pages/Config/ImportABoardConfigurationFile/ImportABoardConfigurationFile.jsx delete mode 100644 misc/config_tools/configurator/src/pages/Config/ImportABoardConfigurationFile/index.jsx create mode 100644 misc/config_tools/configurator/src/pages/Config/Scenario.vue create mode 100644 misc/config_tools/configurator/src/pages/Config/Scenario/NewScenario.vue delete mode 100644 misc/config_tools/configurator/src/pages/Error/Error.jsx delete mode 100644 misc/config_tools/configurator/src/pages/Error/MyErrorBoundary.jsx create mode 100644 misc/config_tools/configurator/src/pages/Welcome.vue delete mode 100644 misc/config_tools/configurator/src/pages/Welcome/ExitACRNConfigurationModal/ExitACRNConfigurationModal.jsx create mode 100644 misc/config_tools/configurator/src/pages/Welcome/NewConfiguration.vue delete mode 100644 misc/config_tools/configurator/src/pages/Welcome/StartNewConfigurationPanel/StartNewConfigurationPanel.jsx delete mode 100644 misc/config_tools/configurator/src/pages/Welcome/StartNewConfigurationPanel/index.jsx delete mode 100644 misc/config_tools/configurator/src/pages/Welcome/UseAnExistingConfigurationPanel/UseAnExistingConfigurationPanel.jsx delete mode 100644 misc/config_tools/configurator/src/pages/Welcome/UseAnExistingConfigurationPanel/index.jsx create mode 100644 misc/config_tools/configurator/src/pages/Welcome/UseExisting.vue delete mode 100644 misc/config_tools/configurator/src/pages/Welcome/Welcome.css delete mode 100644 misc/config_tools/configurator/src/pages/Welcome/Welcome.jsx delete mode 100644 misc/config_tools/configurator/src/plugin/text-plugin.js delete mode 100644 misc/config_tools/configurator/src/plugin/text-plugin.js.map delete mode 100644 misc/config_tools/configurator/src/plugin/text-plugin.ts create mode 100644 misc/config_tools/configurator/src/router.js create mode 100644 misc/config_tools/configurator/thirdLib/.gitignore create mode 100644 misc/config_tools/configurator/thirdLib/library.json create mode 100644 misc/config_tools/configurator/thirdLib/manager.py rename misc/config_tools/configurator/{src/plugin => thirdLib}/tauri-plugin.ts (50%) create mode 100644 misc/config_tools/data/__init__.py create mode 100644 misc/config_tools/launch_config/__init__.py create mode 100644 misc/config_tools/schema/__init__.py diff --git a/.gitignore b/.gitignore index 8eab571ef..5d11210e9 100644 --- a/.gitignore +++ b/.gitignore @@ -9,4 +9,6 @@ build .idea venv *.egg-info -/misc/config_tools/dist \ No newline at end of file +/misc/config_tools/dist +/misc/config_tools/schema/sliced.xsd +/misc/config_tools/schema/allchecks.xsd diff --git a/misc/config_tools/MANIFEST.in b/misc/config_tools/MANIFEST.in new file mode 100644 index 000000000..ae881f0ea --- /dev/null +++ b/misc/config_tools/MANIFEST.in @@ -0,0 +1,4 @@ +graft data +graft schema +graft launch_config +include configurator/src/assets/schema/scenario.json diff --git a/misc/config_tools/build.cmd b/misc/config_tools/build.cmd new file mode 100644 index 000000000..cbf60464b --- /dev/null +++ b/misc/config_tools/build.cmd @@ -0,0 +1,9 @@ +@echo off +python scenario_config/schema_slicer.py +python scenario_config/jsonschema/converter.py +xmllint --xinclude schema/datachecks.xsd > schema/allchecks.xsd +python -m build +rem pip install .\dist\acrn_config_tools-3.0-py3-none-any.whl --force-reinstall +del .\configurator\thirdLib\acrn_config_tools-3.0-py3-none-any.whl +python .\configurator\thirdLib\manager.py install +echo build and install success diff --git a/misc/config_tools/configurator/.gitignore b/misc/config_tools/configurator/.gitignore index f8fcebd05..317c8ccc3 100644 --- a/misc/config_tools/configurator/.gitignore +++ b/misc/config_tools/configurator/.gitignore @@ -21,7 +21,3 @@ build *.njsproj *.sln *.sw? - -# TS temp file -tauri-plugin.js.map -tauri-plugin.js diff --git a/misc/config_tools/configurator/README.md b/misc/config_tools/configurator/README.md index 97248c8d7..1a20730c2 100644 --- a/misc/config_tools/configurator/README.md +++ b/misc/config_tools/configurator/README.md @@ -1,6 +1,6 @@ # ACRN Configurator -This version based on tauri, WIP. +This version is based on Tauri, WIP. ## Features @@ -18,6 +18,10 @@ This version based on tauri, WIP. Please follow [this guide](https://tauri.studio/docs/getting-started/prerequisites) to install system dependencies **(including yarn)**. +In Windows, [chocolatey](https://chocolatey.org/) is a Windows package manager, +you can use `choco install xsltproc` to install `xsltproc` package, +which provide `xmllint` command. + ### 2. Clone Project And Install Project Dependencies. #### Linux @@ -36,7 +40,7 @@ Similar to Linux. On macOS, you may need to install git and python3 via `brew`. -In Windows environment maybe you need to install git and python3 via chocolatey or manually, +In the Windows environment maybe you need to install git and python3 via chocolatey or manually, and replace the command line `python3` with `py -3`. ### 3. How To Build @@ -51,12 +55,18 @@ make configurator #### Windows/macOS -Run follow command in the 'acrn-hypervisor' directory. +Run following command in the 'acrn-hypervisor' directory. ```shell -python3 misc/config_tools/scenario_config/schema_slicer.py -python3 misc/config_tools/scenario_config/xs2js.py -cd misc/config_tools/configurator +cd misc/config_tools +python scenario_config/schema_slicer.py +python scenario_config/xs2js.py +xmllint --xinclude schema/datachecks.xsd > schema/allchecks.xsd + +python -m build + +cd configurator +python thirdLib/manager.py install yarn build ``` @@ -75,5 +85,4 @@ acrn-configurator You can find msi(Windows)/dmg(macOS) folder under the `misc/config_tools/configurator/src-tauri/target/release/bundle` - directory, the installer in the folder. diff --git a/misc/config_tools/configurator/src/lib/common.js b/misc/config_tools/configurator/__init__.py similarity index 100% rename from misc/config_tools/configurator/src/lib/common.js rename to misc/config_tools/configurator/__init__.py diff --git a/misc/config_tools/configurator/index.html b/misc/config_tools/configurator/index.html index 6a0629e54..01767a158 100644 --- a/misc/config_tools/configurator/index.html +++ b/misc/config_tools/configurator/index.html @@ -2,23 +2,23 @@ - + - Vite App - + ACRN Configurator - -
- - + + +
+
+
+ + logo + Loading... + + Please wait for 5 seconds~ +
+
+
+ diff --git a/misc/config_tools/configurator/package.json b/misc/config_tools/configurator/package.json index ff48c9008..b8b78a17c 100644 --- a/misc/config_tools/configurator/package.json +++ b/misc/config_tools/configurator/package.json @@ -15,33 +15,29 @@ "tauri": "tauri" }, "dependencies": { - "@fortawesome/fontawesome-svg-core": "^1.3.0", - "@fortawesome/free-regular-svg-icons": "^6.0.0", - "@fortawesome/free-solid-svg-icons": "^6.0.0", - "@fortawesome/react-fontawesome": "^0.1.17", - "@popperjs/core": "^2.11.2", - "@rjsf/core": "^4.0.1", + "@lljj/vue3-form-naive": "^1.12.2", + "@popperjs/core": "^2.11.5", "@rollup/plugin-replace": "^4.0.0", - "@tauri-apps/api": "^1.0.0-rc.1", + "@tauri-apps/api": "^1.0.0-rc.3", + "@vicons/carbon": "^0.12.0", + "@vicons/fa": "^0.12.0", + "@vicons/utils": "^0.1.4", + "ajv-i18n": "^4.2.0", "bootstrap": "^5.1.3", + "bootstrap-vue-3": "^0.1.10", "js-base64": "^3.7.2", "lodash": "^4.17.21", + "naive-ui": "^2.28.1", "node-fetch": "2", - "query-string": "^7.1.1", - "react": "^17.0.2", - "react-bootstrap": "^2.1.2", - "react-dom": "^17.0.2", - "react-icons": "^4.3.1", - "react-router": "^6.2.1", - "react-router-dom": "^6.2.1", - "vconsole": "^3.14.3" + "sass": "^1.50.0", + "vconsole": "^3.14.6", + "vfonts": "^0.0.3", + "vue": "^3.2.25", + "vue-router": "4" }, "devDependencies": { - "@tauri-apps/cli": "^1.0.0-rc.5", - "@types/lodash": "^4.14.179", - "@types/node": "^17.0.21", - "@vitejs/plugin-react": "^1.0.7", - "sass": "^1.49.9", - "vite": "^2.8.0" + "@tauri-apps/cli": "^1.0.0-rc.8", + "@vitejs/plugin-vue": "^2.3.1", + "vite": "^2.9.2" } } diff --git a/misc/config_tools/configurator/public/favicon.ico b/misc/config_tools/configurator/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..df36fcfb72584e00488330b560ebcf34a41c64c2 GIT binary patch literal 4286 zcmds*O-Phc6o&64GDVCEQHxsW(p4>LW*W<827=Unuo8sGpRux(DN@jWP-e29Wl%wj zY84_aq9}^Am9-cWTD5GGEo#+5Fi2wX_P*bo+xO!)p*7B;iKlbFd(U~_d(U?#hLj56 zPhFkj-|A6~Qk#@g^#D^U0XT1cu=c-vu1+SElX9NR;kzAUV(q0|dl0|%h|dI$%VICy zJnu2^L*Te9JrJMGh%-P79CL0}dq92RGU6gI{v2~|)p}sG5x0U*z<8U;Ij*hB9z?ei z@g6Xq-pDoPl=MANPiR7%172VA%r)kevtV-_5H*QJKFmd;8yA$98zCxBZYXTNZ#QFk2(TX0;Y2dt&WitL#$96|gJY=3xX zpCoi|YNzgO3R`f@IiEeSmKrPSf#h#Qd<$%Ej^RIeeYfsxhPMOG`S`Pz8q``=511zm zAm)MX5AV^5xIWPyEu7u>qYs?pn$I4nL9J!=K=SGlKLXpE<5x+2cDTXq?brj?n6sp= zphe9;_JHf40^9~}9i08r{XM$7HB!`{Ys~TK0kx<}ZQng`UPvH*11|q7&l9?@FQz;8 zx!=3<4seY*%=OlbCbcae?5^V_}*K>Uo6ZWV8mTyE^B=DKy7-sdLYkR5Z?paTgK-zyIkKjIcpyO z{+uIt&YSa_$QnN_@t~L014dyK(fOOo+W*MIxbA6Ndgr=Y!f#Tokqv}n<7-9qfHkc3 z=>a|HWqcX8fzQCT=dqVbogRq!-S>H%yA{1w#2Pn;=e>JiEj7Hl;zdt-2f+j2%DeVD zsW0Ab)ZK@0cIW%W7z}H{&~yGhn~D;aiP4=;m-HCo`BEI+Kd6 z={Xwx{TKxD#iCLfl2vQGDitKtN>z|-AdCN|$jTFDg0m3O`WLD4_s#$S literal 0 HcmV?d00001 diff --git a/misc/config_tools/configurator/pyodide/README.md b/misc/config_tools/configurator/pyodide/README.md new file mode 100644 index 000000000..0760f8145 --- /dev/null +++ b/misc/config_tools/configurator/pyodide/README.md @@ -0,0 +1,27 @@ +# ACRN Configurator WASM Python Module + +Every file must set `__package__ = 'configurator.pyodide'` before import, +set this magic var can resolve python relative import error when we direct run it. + +## Function define + +Every python script need a test function and a main function. + +### test + +run script will call this function, +so please set script default params in this function + +### main + +in js side will use this function. +like: + +```javascript +// after pyodide install all dependices +var launch_cfg_gen = pyodide.pyimport("configurator.pyodide.launch_cfg_gen").main; +var board_xml = this.readFile('xxxx/board.xml'); +var scenario_xml = this.readFile('xxx/scenario.xml'); +var launch_scripts = launch_cfg_gen(board_xml, scenario_xml); +console.log(launch_scripts) +``` diff --git a/misc/config_tools/configurator/pyodide/__init__.py b/misc/config_tools/configurator/pyodide/__init__.py new file mode 100644 index 000000000..d2958166b --- /dev/null +++ b/misc/config_tools/configurator/pyodide/__init__.py @@ -0,0 +1 @@ +from .pyodide import * diff --git a/misc/config_tools/configurator/pyodide/generateLaunchScript.py b/misc/config_tools/configurator/pyodide/generateLaunchScript.py new file mode 100644 index 000000000..f5974dd42 --- /dev/null +++ b/misc/config_tools/configurator/pyodide/generateLaunchScript.py @@ -0,0 +1,51 @@ +#!/usr/bin/env python3 +__package__ = 'configurator.pyodide' + +import os +from tempfile import TemporaryDirectory +from pathlib import Path + +from launch_config.launch_cfg_gen import main as launch_cfg_gen_main + +from .pyodide import convert_result, nuc11_board, nuc11_scenario, write_temp_file + + +def generate_launch_script(board, scenario, user_vm_id=0): + """ + + :param board: board xml text + :param scenario: scenario xml text + :param user_vm_id: the vm which you want to generate launch script, will generate all launch script if it set to zero + """ + launch_scripts = {} + with TemporaryDirectory() as tmpdir: + # Write file to dir + write_temp_file(tmpdir, { + 'board.xml': board, + 'scenario.xml': scenario + }) + + # define path + board_file_path = Path(tmpdir) / 'board.xml' + scenario_file_path = Path(tmpdir) / 'scenario.xml' + launch_script_output_dir = Path(tmpdir) / 'output' + + # generate launch script + launch_cfg_gen_main(board_file_path, scenario_file_path, user_vm_id, launch_script_output_dir) + + # get output and convert it to {filename: content} + for filename in os.listdir(launch_script_output_dir): + abs_name = launch_script_output_dir / str(filename) + launch_scripts[filename] = open(abs_name, encoding='utf-8').read() + return convert_result(launch_scripts) + + +main = generate_launch_script + + +def test(): + main(nuc11_board, nuc11_scenario) + + +if __name__ == '__main__': + test() diff --git a/misc/config_tools/configurator/pyodide/loadBoard.py b/misc/config_tools/configurator/pyodide/loadBoard.py new file mode 100644 index 000000000..9f7fb1742 --- /dev/null +++ b/misc/config_tools/configurator/pyodide/loadBoard.py @@ -0,0 +1,98 @@ +#!/usr/bin/env python3 +__package__ = 'configurator.pyodide' + +import json +from copy import deepcopy + +import elementpath +import lxml.etree as etree +from bs4 import BeautifulSoup + +from . import convert_result, nuc11_board, scenario_json_schema + + +def get_dynamic_scenario(board): + """ + + :type board: str + :param board: board xml text + """ + board_xml = etree.fromstring(board) + + def get_enum(source, options): + elements = [str(x) for x in elementpath.select(source, options) if x] + elements = list(set(elements)) + if not elements: + elements = [''] + return elements + + def dynamic_enum(**enum_setting): + # value from env + function, source = [ + {"get_enum": get_enum, "board_xml": board_xml}[enum_setting[key]] + for key in ['function', 'source'] + ] + # value from given + selector, sorted_func = [enum_setting[key] for key in ['selector', 'sorted']] + + # get enum data + enum = function(source, selector) + if sorted_func: + enum = sorted(enum, key=eval(sorted_func)) + return enum + + def dynamic_enum_apply(obj): + # get json schema enum obj + if 'enum' in obj and isinstance(obj['enum'], dict): + enum_setting = obj['enum'] + # check enum obj type + if enum_setting['type'] == 'dynamicEnum': + del enum_setting['type'] + # replace json schema obj enum field data + obj['enum'] = dynamic_enum(**enum_setting) + return obj + + data = json.loads(scenario_json_schema, object_hook=dynamic_enum_apply) + + form_schemas = {} + tab_types = ['HV', 'PreLaunchedVM', 'ServiceVM', 'PostLaunchedVM'] + form_types = ['BasicConfigType', 'AdvancedConfigType'] + for tab_type in tab_types: + form_schemas[tab_type] = {} + for form_type in form_types: + form_schema = deepcopy(data) + current_form_type_schema_obj = form_schema['definitions'][f'{tab_type}{form_type}'] + for key in ['type', 'required', 'properties']: + form_schema[key] = current_form_type_schema_obj[key] + form_schemas[tab_type][form_type] = form_schema + + return form_schemas + + +def get_board_info(board): + soup = BeautifulSoup(board, 'xml') + result = { + 'name': soup.select_one('acrn-config').attrs['board'] + '.board.xml', + 'content': board, + 'BIOS_INFO': soup.select_one('BIOS_INFO').text, + 'BASE_BOARD_INFO': soup.select_one('BASE_BOARD_INFO').text + } + return result + + +def load_board(board): + result = { + 'scenarioJSONSchema': get_dynamic_scenario(board), + 'boardInfo': get_board_info(board) + } + return convert_result(result) + + +def test(): + load_board(nuc11_board) + + +main = load_board + +if __name__ == '__main__': + test() diff --git a/misc/config_tools/configurator/pyodide/loadScenario.py b/misc/config_tools/configurator/pyodide/loadScenario.py new file mode 100644 index 000000000..897e2eabc --- /dev/null +++ b/misc/config_tools/configurator/pyodide/loadScenario.py @@ -0,0 +1,78 @@ +#!/usr/bin/env python3 +__package__ = 'configurator.pyodide' + +import json + +import xmltodict + +from . import convert_result, nuc11_scenario, scenario_json_schema + + +def get_array_and_int_keys(): + array_keys = [] + int_keys = ['@id'] + + def object_mapper(obj): + if not isinstance(obj, dict): + return obj + for key, value in obj.items(): + if not isinstance(value, dict): + continue + if value.get('type', '') == 'array': + array_keys.append(key) + elif value.get('type', '') == 'integer': + int_keys.append(key) + return obj + + json.loads(scenario_json_schema, object_hook=object_mapper) + array_keys = list(set(array_keys)) + int_keys = list(set(int_keys)) + return array_keys, int_keys + + +def load_scenario_xml(scenario): + """ + convert scenario xml to json data followed scenario json schema + + :type scenario: str + :param scenario: scenario xml text + :return: + """ + arr_keys, int_keys = get_array_and_int_keys() + scenario_xml = xmltodict.parse(scenario) + scenario_xml = json.dumps(scenario_xml) + + def correct_struct(obj): + if not isinstance(obj, dict): + return obj + keys_need_remove = [] + for key, value in obj.items(): + if value is None: + keys_need_remove.append(key) + continue + if key in int_keys: + if isinstance(obj[key], list): + obj[key] = [int(x) for x in obj[key]] + elif not isinstance(value, int): + obj[key] = int(value) + if key in arr_keys and not isinstance(value, list): + obj[key] = [value] + for key in keys_need_remove: + del obj[key] + return obj + + scenario_dict = json.loads(scenario_xml, object_hook=correct_struct) + return scenario_dict + + +def main(scenario): + result = load_scenario_xml(scenario) + return convert_result(result) + + +def test(): + main(nuc11_scenario) + + +if __name__ == '__main__': + test() diff --git a/misc/config_tools/configurator/pyodide/pyodide.py b/misc/config_tools/configurator/pyodide/pyodide.py new file mode 100644 index 000000000..6a1484dc8 --- /dev/null +++ b/misc/config_tools/configurator/pyodide/pyodide.py @@ -0,0 +1,60 @@ +#!/usr/bin/env python3 +__package__ = 'configurator.pyodide' + +import json +import sys +from pathlib import Path + + +class LazyPath: + def __init__(self, my): + self.my = my + + def __truediv__(self, other): + return str(self.my / other) + + +def file_text(path): + return open(path, encoding='utf-8').read() + + +# path define +config_tools_dir = Path(__file__).absolute().parent.parent.parent +configurator_dir = config_tools_dir / 'configurator' +schema_dir = config_tools_dir / 'schema' +scenario_xml_schema_path = schema_dir / 'sliced.xsd' +datachecks_xml_schema_path = schema_dir / 'allchecks.xsd' + +nuc11_folder = LazyPath(config_tools_dir / 'data' / 'nuc11tnbi5') + +# file define +nuc11_board = file_text(nuc11_folder / 'nuc11tnbi5.xml') +nuc11_scenario = file_text(nuc11_folder / 'shared_launch_6user_vm.xml') +scenario_json_schema = file_text(configurator_dir / 'src' / 'assets' / 'schema' / 'scenario.json') + +debug = sys.platform != 'emscripten' + + +def convert_result(result): + if debug: + print(json.dumps(result, indent=' ')) + return json.dumps(result) + + +def write_temp_file(tmpdir, file_dict: dict): + temp_path = Path(tmpdir) + for filename, content in file_dict.items(): + with open(temp_path / filename, 'w', encoding='utf-8') as f: + f.write(content) + + +def main(): + pass + + +def test(): + pass + + +if __name__ == '__main__': + test() diff --git a/misc/config_tools/configurator/pyodide/tests.py b/misc/config_tools/configurator/pyodide/tests.py new file mode 100644 index 000000000..9ef904e48 --- /dev/null +++ b/misc/config_tools/configurator/pyodide/tests.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python3 +__package__ = 'configurator.pyodide' + +from .loadBoard import test as load_board_test +from .loadScenario import test as load_scenario_test +from .generateLaunchScript import test as generate_launch_script_test +from .validateScenario import test as validate_scenario_test + + +def main(): + load_board_test() + load_scenario_test() + generate_launch_script_test() + validate_scenario_test() + + +def test(): + main() + + +if __name__ == '__main__': + test() diff --git a/misc/config_tools/configurator/pyodide/validateScenario.py b/misc/config_tools/configurator/pyodide/validateScenario.py new file mode 100644 index 000000000..f1c7edf3c --- /dev/null +++ b/misc/config_tools/configurator/pyodide/validateScenario.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python3 +__package__ = 'configurator.pyodide' + +from pathlib import Path +from tempfile import TemporaryDirectory + +from scenario_config.default_populator import DefaultValuePopulatingStage +from scenario_config.pipeline import PipelineObject, PipelineEngine +from scenario_config.validator import ValidatorConstructionByFileStage, SemanticValidationStage +from scenario_config.xml_loader import XMLLoadStage + +from .pyodide import ( + convert_result, write_temp_file, + nuc11_board, nuc11_scenario, scenario_xml_schema_path, datachecks_xml_schema_path +) + + +def main(board, scenario): + pipeline = PipelineEngine(["board_path", "scenario_path", "schema_path", "datachecks_path"]) + pipeline.add_stages([ + ValidatorConstructionByFileStage(), + XMLLoadStage("schema"), + + XMLLoadStage("board"), + XMLLoadStage("scenario"), + DefaultValuePopulatingStage(), + SemanticValidationStage(), + ]) + with TemporaryDirectory() as tmpdir: + write_temp_file(tmpdir, { + 'board.xml': board, + 'scenario.xml': scenario + }) + board_file_path = Path(tmpdir) / 'board.xml' + scenario_file_path = Path(tmpdir) / 'scenario.xml' + + obj = PipelineObject( + board_path=board_file_path, + scenario_path=scenario_file_path, + schema_path=scenario_xml_schema_path, + datachecks_path=datachecks_xml_schema_path + ) + pipeline.run(obj) + + validate_result = obj.get("semantic_errors") + return convert_result(validate_result) + + +def test(): + main(nuc11_board, nuc11_scenario) + + +if __name__ == '__main__': + test() diff --git a/misc/config_tools/configurator/requirements.txt b/misc/config_tools/configurator/requirements.txt index a519e4a90..404cda000 100644 --- a/misc/config_tools/configurator/requirements.txt +++ b/misc/config_tools/configurator/requirements.txt @@ -1,7 +1,3 @@ -lxml -xmltodict -xmlschema -defusedxml +build +tqdm requests -bs4 -sphinx diff --git a/misc/config_tools/configurator/src-tauri/.gitignore b/misc/config_tools/configurator/src-tauri/.gitignore index dd7b1f523..c12370459 100644 --- a/misc/config_tools/configurator/src-tauri/.gitignore +++ b/misc/config_tools/configurator/src-tauri/.gitignore @@ -2,13 +2,3 @@ # will have compiled files and executables /target/ WixTools - -# These are backup files generated by rustfmt -**/*.rs.bk - -config.json -bundle.json - -# ts temp file -types/*.js -types/*.map diff --git a/misc/config_tools/configurator/src-tauri/Cargo.lock b/misc/config_tools/configurator/src-tauri/Cargo.lock index 20c550165..a3c3b78d8 100644 --- a/misc/config_tools/configurator/src-tauri/Cargo.lock +++ b/misc/config_tools/configurator/src-tauri/Cargo.lock @@ -6,8 +6,7 @@ version = 3 name = "acrn-configurator" version = "0.1.0" dependencies = [ - "dirs 4.0.0", - "env_logger", + "dirs", "glob", "itertools", "log", @@ -38,6 +37,21 @@ dependencies = [ "memchr", ] +[[package]] +name = "alloc-no-stdlib" +version = "2.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35ef4730490ad1c4eae5c4325b2a95f521d023e5c885853ff7aca0a6a1631db3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "697ed7edc0f1711de49ce108c541623a0af97c6c60b2f6e2b65229847ac843c2" +dependencies = [ + "alloc-no-stdlib", +] + [[package]] name = "ansi_term" version = "0.12.1" @@ -49,41 +63,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.55" +version = "1.0.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "159bb86af3a200e19a068f4224eae4c8bb2d0fa054c7e5d1cacd5cef95e684cd" - -[[package]] -name = "arrayref" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" - -[[package]] -name = "arrayvec" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" - -[[package]] -name = "arrayvec" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" - -[[package]] -name = "ashpd" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "098dee97729c0164b39a8a7de9c20e4b0eb9cd57f87c8bb465224587b44b1683" -dependencies = [ - "enumflags2", - "futures", - "rand 0.8.5", - "serde", - "serde_repr", - "zbus", -] +checksum = "4361135be9122e0870de935d7c439aef945b9f9ddd4199a553b5270b49c82a27" [[package]] name = "async-broadcast" @@ -162,15 +144,15 @@ dependencies = [ [[package]] name = "async-task" -version = "4.1.0" +version = "4.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d306121baf53310a3fd342d88dc0824f6bbeace68347593658525565abee8" +checksum = "30696a84d817107fc028e049980e09d5e140e8da8f1caeb17e8e950658a3cea9" [[package]] name = "async-trait" -version = "0.1.52" +version = "0.1.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "061a7acccaa286c011ddc30970520b98fa40e00c9d644633fb26b5fc63a265e3" +checksum = "ed6aa3524a2dfcf9fe180c51eae2b58738348d819517ceadf95789c51fff7600" dependencies = [ "proc-macro2", "quote", @@ -195,8 +177,8 @@ version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "58aeb089fb698e06db8089971c7ee317ab9644bade33383f63631437b03aafb6" dependencies = [ - "glib-sys 0.15.6", - "gobject-sys 0.15.5", + "glib-sys 0.15.10", + "gobject-sys 0.15.10", "libc", "system-deps 6.0.2", ] @@ -219,17 +201,6 @@ dependencies = [ "wildmatch", ] -[[package]] -name = "atty" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -dependencies = [ - "hermit-abi", - "libc", - "winapi", -] - [[package]] name = "autocfg" version = "1.1.0" @@ -257,32 +228,6 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" -[[package]] -name = "blake2b_simd" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afa748e348ad3be8263be728124b24a24f268266f6f5d58af9d75f6a40b5c587" -dependencies = [ - "arrayref", - "arrayvec 0.5.2", - "constant_time_eq", -] - -[[package]] -name = "blake3" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a08e53fc5a564bb15bfe6fae56bd71522205f1f91893f9c0116edad6496c183f" -dependencies = [ - "arrayref", - "arrayvec 0.7.2", - "cc", - "cfg-if", - "constant_time_eq", - "digest", - "rayon", -] - [[package]] name = "block" version = "0.1.6" @@ -298,6 +243,27 @@ dependencies = [ "generic-array", ] +[[package]] +name = "brotli" +version = "3.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1a0b1dbcc8ae29329621f8d4f0d835787c1c38bb1401979b49d13b0b305ff68" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ad2d4653bf5ca36ae797b1f4bb4dbddb60ce49ca4aed8a2ce4829f60425b80" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + [[package]] name = "bstr" version = "0.2.17" @@ -325,27 +291,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" -[[package]] -name = "bzip2" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6afcd980b5f3a45017c57e57a2fcccbb351cc43a356ce117ef760ef8052b89b0" -dependencies = [ - "bzip2-sys", - "libc", -] - -[[package]] -name = "bzip2-sys" -version = "0.1.11+1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc" -dependencies = [ - "cc", - "libc", - "pkg-config", -] - [[package]] name = "cache-padded" version = "1.2.0" @@ -354,9 +299,9 @@ checksum = "c1db59621ec70f09c5e9b597b220c7a2b43611f4710dc03ceb8748637775692c" [[package]] name = "cairo-rs" -version = "0.15.6" +version = "0.15.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8b14c80d8d1a02fa6d914b9d1afeeca9bc34257f8300d9696e1e331ae114223" +checksum = "129e928d3eda625f53ce257589efbe5143416875fd01bddd08c8c6feb8b9962b" dependencies = [ "bitflags", "cairo-sys-rs", @@ -371,16 +316,16 @@ version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c55d429bef56ac9172d25fecb85dc8068307d17acd74b377866b7a1ef25d3c8" dependencies = [ - "glib-sys 0.15.6", + "glib-sys 0.15.10", "libc", "system-deps 6.0.2", ] [[package]] name = "cargo_toml" -version = "0.11.4" +version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e270ef0cd868745878982f7ce470aa898d0d4bb248af67f0cf66f54617913ef" +checksum = "5809dd3e6444651fd1cdd3dbec71eca438c439a0fcc8081674a14da0afe50185" dependencies = [ "serde", "serde_derive", @@ -392,15 +337,18 @@ name = "cc" version = "1.0.73" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" -dependencies = [ - "jobserver", -] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" [[package]] name = "cfb" -version = "0.4.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca453e8624711b2f0f4eb47076a318feda166252a827ee25d067b43de83dcba0" +checksum = "74f89d248799e3f15f91b70917f65381062a01bb8e222700ea0e5a7ff9785f9c" dependencies = [ "byteorder", "uuid", @@ -445,34 +393,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" -[[package]] -name = "chrono" -version = "0.4.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" -dependencies = [ - "libc", - "num-integer", - "num-traits", - "time", - "winapi", -] - -[[package]] -name = "clap" -version = "3.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5177fac1ab67102d8989464efd043c6ff44191b1557ec1ddd489b4f7e1447e77" -dependencies = [ - "atty", - "bitflags", - "indexmap", - "os_str_bytes", - "strsim 0.10.0", - "termcolor", - "textwrap", -] - [[package]] name = "cocoa" version = "0.24.0" @@ -504,6 +424,16 @@ dependencies = [ "objc", ] +[[package]] +name = "combine" +version = "4.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50b727aacc797f9fc28e355d21f34709ac4fc9adecfe470ad07b8f4464f53062" +dependencies = [ + "bytes", + "memchr", +] + [[package]] name = "concurrent-queue" version = "1.2.2" @@ -513,12 +443,6 @@ dependencies = [ "cache-padded", ] -[[package]] -name = "constant_time_eq" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" - [[package]] name = "convert_case" version = "0.4.0" @@ -568,9 +492,9 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95059428f66df56b63431fdb4e1947ed2190586af5c5a8a8b71122bdf5a7f469" +checksum = "59a6001667ab124aebae2a495118e11d30984c3a653e99d86d58971708cf5e4b" dependencies = [ "libc", ] @@ -586,43 +510,19 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.2" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e54ea8bc3fb1ee042f5aace6e3c6e025d3874866da222930f70ce62aceba0bfa" +checksum = "5aaa7bd5fb665c6864b5f963dd9097905c54125909c7aa94c9e18507cdbe6c53" dependencies = [ "cfg-if", "crossbeam-utils", ] -[[package]] -name = "crossbeam-deque" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6455c0ca19f0d2fbf751b908d5c55c1f5cbc65e03c4225427254b46890bdde1e" -dependencies = [ - "cfg-if", - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c00d6d2ea26e8b151d99093005cb442fb9a37aeaca582a03ec70946f49ab5ed9" -dependencies = [ - "cfg-if", - "crossbeam-utils", - "lazy_static", - "memoffset", - "scopeguard", -] - [[package]] name = "crossbeam-utils" -version = "0.8.7" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e5bed1f1c269533fa816a0a5492b3545209a205ca1a54842be180eb63a16a6" +checksum = "0bf124c720b7686e3c2663cf54062ab0f68a88af2fb6a030e87e30bf721fcb38" dependencies = [ "cfg-if", "lazy_static", @@ -667,9 +567,9 @@ dependencies = [ [[package]] name = "ctor" -version = "0.1.21" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccc0a48a9b826acdf4028595adc9db92caea352f7af011a3034acd172a52a0aa" +checksum = "f877be4f7c9f246b183111634f75baa039715e3f46ce860677d3b19a69fb229c" dependencies = [ "quote", "syn", @@ -693,12 +593,12 @@ dependencies = [ [[package]] name = "darling" -version = "0.13.1" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0d720b8683f8dd83c65155f0530560cba68cd2bf395f6513a483caee57ff7f4" +checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c" dependencies = [ - "darling_core 0.13.1", - "darling_macro 0.13.1", + "darling_core 0.13.4", + "darling_macro 0.13.4", ] [[package]] @@ -717,9 +617,9 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.13.1" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a340f241d2ceed1deb47ae36c4144b2707ec7dd0b649f894cb39bb595986324" +checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610" dependencies = [ "fnv", "ident_case", @@ -742,11 +642,11 @@ dependencies = [ [[package]] name = "darling_macro" -version = "0.13.1" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72c41b3b7352feb3211a0d743dc5700a4e3b60f51bd2b368892d1e0f9a95f44b" +checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" dependencies = [ - "darling_core 0.13.1", + "darling_core 0.13.4", "quote", "syn", ] @@ -763,12 +663,11 @@ dependencies = [ [[package]] name = "deflate" -version = "0.8.6" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73770f8e1fe7d64df17ca66ad28994a0a623ea497fa69486e14984e715c5d174" +checksum = "c86f7e25f518f4b81808a2cf1c50996a61f5c2eb394b2393bd87f2a4780a432f" dependencies = [ "adler32", - "byteorder", ] [[package]] @@ -803,18 +702,6 @@ checksum = "f2fb860ca6fafa5552fb6d0e816a69c8e49f0908bf524e30a90d97c85892d506" dependencies = [ "block-buffer", "crypto-common", - "subtle", -] - -[[package]] -name = "dirs" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fd78930633bd1c6e35c4b42b1df7b0cbc6bc191146e512bb3bedf243fcc3901" -dependencies = [ - "libc", - "redox_users 0.3.5", - "winapi", ] [[package]] @@ -843,7 +730,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" dependencies = [ "libc", - "redox_users 0.4.0", + "redox_users", "winapi", ] @@ -854,7 +741,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" dependencies = [ "libc", - "redox_users 0.4.0", + "redox_users", "winapi", ] @@ -899,9 +786,9 @@ checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" [[package]] name = "enumflags2" -version = "0.7.3" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a25c90b056b3f84111cf183cbeddef0d3a0bbe9a674f057e1a1533c315f24def" +checksum = "e75d4cd21b95383444831539909fbb14b9dc3fdceb2a6f5d36577329a1f55ccb" dependencies = [ "enumflags2_derive", "serde", @@ -909,28 +796,15 @@ dependencies = [ [[package]] name = "enumflags2_derive" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "144ec79496cbab6f84fa125dc67be9264aef22eb8a28da8454d9c33f15108da4" +checksum = "f58dc3c5e468259f19f2d46304a6b28f1c3d034442e14b322d2b850e36f6d5ae" dependencies = [ "proc-macro2", "quote", "syn", ] -[[package]] -name = "env_logger" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b2cf0344971ee6c64c31be0d530793fba457d322dfec2810c453d0ef228f9c3" -dependencies = [ - "atty", - "humantime", - "log", - "regex", - "termcolor", -] - [[package]] name = "event-listener" version = "2.5.2" @@ -958,26 +832,26 @@ dependencies = [ [[package]] name = "filetime" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "975ccf83d8d9d0d84682850a38c8169027be83368805971cc4f238c2b245bc98" +checksum = "c0408e2626025178a6a7f7ffc05a25bc47103229f19c113755de7bf63816290c" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.2.10", + "redox_syscall", "winapi", ] [[package]] name = "flate2" -version = "1.0.22" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e6988e897c1c9c485f43b47a529cef42fde0547f9d8d41a7062518f1d8fc53f" +checksum = "b39522e96686d38f4bc984b9198e3a0613264abaebaff2c5c918bfa6b6da09af" dependencies = [ "cfg-if", "crc32fast", "libc", - "miniz_oxide 0.4.4", + "miniz_oxide", ] [[package]] @@ -1152,9 +1026,9 @@ dependencies = [ [[package]] name = "gdk-pixbuf" -version = "0.15.6" +version = "0.15.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8750501d75f318c2ec0314701bc8403901303210def80bafd13f6b6059a3f45" +checksum = "678516f1baef591d270ca10587c01a12542a731a7879cc62391a18191a470831" dependencies = [ "bitflags", "gdk-pixbuf-sys", @@ -1165,13 +1039,13 @@ dependencies = [ [[package]] name = "gdk-pixbuf-sys" -version = "0.15.1" +version = "0.15.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413424d9818621fa3cfc8a3a915cdb89a7c3c507d56761b4ec83a9a98e587171" +checksum = "140b2f5378256527150350a8346dbdb08fadc13453a7a2d73aecd5fab3c402a7" dependencies = [ - "gio-sys 0.15.6", - "glib-sys 0.15.6", - "gobject-sys 0.15.5", + "gio-sys 0.15.10", + "glib-sys 0.15.10", + "gobject-sys 0.15.10", "libc", "system-deps 6.0.2", ] @@ -1184,9 +1058,9 @@ checksum = "32e7a08c1e8f06f4177fb7e51a777b8c1689f743a7bc11ea91d44d2226073a88" dependencies = [ "cairo-sys-rs", "gdk-pixbuf-sys", - "gio-sys 0.15.6", - "glib-sys 0.15.6", - "gobject-sys 0.15.5", + "gio-sys 0.15.10", + "glib-sys 0.15.10", + "gobject-sys 0.15.10", "libc", "pango-sys", "pkg-config", @@ -1200,7 +1074,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4b7f8c7a84b407aa9b143877e267e848ff34106578b64d1e0a24bf550716178" dependencies = [ "gdk-sys", - "glib-sys 0.15.6", + "glib-sys 0.15.10", "libc", "system-deps 6.0.2", "x11", @@ -1242,9 +1116,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d39cd93900197114fa1fcb7ae84ca742095eed9442088988ae74fa744e930e77" +checksum = "9be70c98951c83b8d2f8f60d7065fa6d5146873094452a1008da8c2f1e4205ad" dependencies = [ "cfg-if", "libc", @@ -1253,15 +1127,15 @@ dependencies = [ [[package]] name = "gio" -version = "0.15.6" +version = "0.15.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96efd8a1c00d890f6b45671916e165b5e43ccec61957d443aff6d7e44f62d348" +checksum = "76cd21a7a674ea811749661012512b0ba5237ba404ccbcab2850db5537549b64" dependencies = [ "bitflags", "futures-channel", "futures-core", "futures-io", - "gio-sys 0.15.6", + "gio-sys 0.15.10", "glib", "libc", "once_cell", @@ -1283,12 +1157,12 @@ dependencies = [ [[package]] name = "gio-sys" -version = "0.15.6" +version = "0.15.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d0fa5052773f5a56b8ae47dab09d040f5d9ce1311f4f99006e16e9a08269296" +checksum = "32157a475271e2c4a023382e9cab31c4584ee30a97da41d3c4e9fdd605abcf8d" dependencies = [ - "glib-sys 0.15.6", - "gobject-sys 0.15.5", + "glib-sys 0.15.10", + "gobject-sys 0.15.10", "libc", "system-deps 6.0.2", "winapi", @@ -1296,9 +1170,9 @@ dependencies = [ [[package]] name = "glib" -version = "0.15.6" +version = "0.15.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa570813c504bdf7539a9400180c2dd4b789a819556fb86da7226d7d1b037b49" +checksum = "a826fad715b57834920839d7a594c3b5e416358c7d790bdaba847a40d7c1d96d" dependencies = [ "bitflags", "futures-channel", @@ -1306,8 +1180,8 @@ dependencies = [ "futures-executor", "futures-task", "glib-macros", - "glib-sys 0.15.6", - "gobject-sys 0.15.5", + "glib-sys 0.15.10", + "gobject-sys 0.15.10", "libc", "once_cell", "smallvec", @@ -1316,9 +1190,9 @@ dependencies = [ [[package]] name = "glib-macros" -version = "0.15.6" +version = "0.15.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41bfd8d227dead0829ac142454e97531b93f576d0805d779c42bfd799c65c572" +checksum = "dac4d47c544af67747652ab1865ace0ffa1155709723ac4f32e97587dd4735b2" dependencies = [ "anyhow", "heck 0.4.0", @@ -1341,9 +1215,9 @@ dependencies = [ [[package]] name = "glib-sys" -version = "0.15.6" +version = "0.15.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4366377bd56697de8aaee24e673c575d2694d72e7756324ded2b0428829a7b8" +checksum = "ef4b192f8e65e9cf76cbf4ea71fa8e3be4a0e18ffe3d68b8da6836974cc5bad4" dependencies = [ "libc", "system-deps 6.0.2", @@ -1381,11 +1255,11 @@ dependencies = [ [[package]] name = "gobject-sys" -version = "0.15.5" +version = "0.15.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df6859463843c20cf3837e3a9069b6ab2051aeeadf4c899d33344f4aea83189a" +checksum = "0d57ce44246becd17153bd035ab4d32cfee096a657fc01f2231c9278378d1e0a" dependencies = [ - "glib-sys 0.15.6", + "glib-sys 0.15.10", "libc", "system-deps 6.0.2", ] @@ -1423,9 +1297,9 @@ dependencies = [ "cairo-sys-rs", "gdk-pixbuf-sys", "gdk-sys", - "gio-sys 0.15.6", - "glib-sys 0.15.6", - "gobject-sys 0.15.5", + "gio-sys 0.15.10", + "glib-sys 0.15.10", + "gobject-sys 0.15.10", "libc", "pango-sys", "system-deps 6.0.2", @@ -1445,12 +1319,6 @@ dependencies = [ "syn", ] -[[package]] -name = "hashbrown" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" - [[package]] name = "heck" version = "0.3.3" @@ -1483,9 +1351,9 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "html5ever" -version = "0.25.1" +version = "0.25.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aafcf38a1a36118242d29b92e1b08ef84e67e4a5ed06e0a80be20e6a32bfed6b" +checksum = "e5c13fb08e5d4dfc151ee5e88bae63f7773d61852f3bdc73c9f4b9e1bde03148" dependencies = [ "log", "mac", @@ -1512,12 +1380,6 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "21dec9db110f5f872ed9699c3ecf50cf16f423502706ba5c72462e28d3157573" -[[package]] -name = "humantime" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" - [[package]] name = "ico" version = "0.1.0" @@ -1563,21 +1425,11 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "indexmap" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282a6247722caba404c065016bbfa522806e51714c34f5dfc3e4a3a46fcb4223" -dependencies = [ - "autocfg", - "hashbrown", -] - [[package]] name = "infer" -version = "0.4.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f92b41dab759f9e8427c03f519c344a14655490b8db548dac1e57a75b3258391" +checksum = "20b2b533137b9cad970793453d4f921c2e91312a6d88b1085c07bc15fc51bb3b" dependencies = [ "cfb", ] @@ -1638,32 +1490,37 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "905fbb87419c5cde6e3269537e4ea7d46431f3008c5d057e915ef3f115e7793c" dependencies = [ - "glib-sys 0.15.6", - "gobject-sys 0.15.5", + "glib-sys 0.15.10", + "gobject-sys 0.15.10", "libc", "system-deps 5.0.0", ] +[[package]] +name = "jni" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24967112a1e4301ca5342ea339763613a37592b8a6ce6cf2e4494537c7a42faf" +dependencies = [ + "cesu8", + "combine", + "jni-sys", + "log", + "thiserror", + "walkdir", +] + [[package]] name = "jni-sys" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" -[[package]] -name = "jobserver" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af25a77299a7f711a01975c35a6a424eb6862092cc2d6c72c4ed6cbc56dfc1fa" -dependencies = [ - "libc", -] - [[package]] name = "js-sys" -version = "0.3.56" +version = "0.3.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a38fc24e30fd564ce974c02bf1d337caddff65be6cc4735a1f7eab22a7440f04" +checksum = "671a26f820db17c2a2750743f1dd03bafd15b98c9f30c7c2628c024c05d73397" dependencies = [ "wasm-bindgen", ] @@ -1699,24 +1556,25 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.119" +version = "0.2.124" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bf2e165bb3457c8e098ea76f3e3bc9db55f87aa90d52d0e6be741470916aaa4" +checksum = "21a41fed9d98f27ab1c6d161da622a4fa35e8a54a8adc24bbf3ddd0ef70b0e50" [[package]] name = "lock_api" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88943dd7ef4a2e5a4bfa2753aaab3013e34ce2533d1996fb18ef591e315e2b3b" +checksum = "327fa5b6a6940e4699ec49a9beae1ea4845c6bab9314e4f84ac68742139d8c53" dependencies = [ + "autocfg", "scopeguard", ] [[package]] name = "log" -version = "0.4.14" +version = "0.4.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" +checksum = "6389c490849ff5bc16be905ae24bc913a9c8892e19b2341dbc175e14c341c2b8" dependencies = [ "cfg-if", ] @@ -1744,14 +1602,15 @@ checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" [[package]] name = "mac-notification-sys" -version = "0.3.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dfb6b71a9a89cd38b395d994214297447e8e63b1ba5708a9a2b0b1048ceda76" +checksum = "297c13fc8ff9fa8b2d0e53850f80e0aa962628e865d447031ce58cdb062e5b29" dependencies = [ "cc", - "chrono", - "dirs 1.0.5", + "dirs-next", "objc-foundation", + "objc_id", + "time", ] [[package]] @@ -1809,28 +1668,18 @@ dependencies = [ [[package]] name = "miniz_oxide" -version = "0.3.7" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "791daaae1ed6889560f8c4359194f56648355540573244a5448a83ba1ecc7435" -dependencies = [ - "adler32", -] - -[[package]] -name = "miniz_oxide" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" +checksum = "d2b29bd4bc3f33391105ebee3589c19197c4271e3e5a9ec9bfe8127eeff8f082" dependencies = [ "adler", - "autocfg", ] [[package]] name = "native-tls" -version = "0.2.8" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48ba9f7719b5a0f42f338907614285fb5fd70e53858141f69898a1fb7203b24d" +checksum = "fd7e2f3618557f980e0b17e8856252eee3c97fa12c54dff0ca290fb6266ca4a9" dependencies = [ "lazy_static", "libc", @@ -1859,15 +1708,15 @@ dependencies = [ [[package]] name = "ndk-context" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e3c5cc68637e21fe8f077f6a1c9e0b9ca495bb74895226b476310f613325884" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" [[package]] name = "ndk-glue" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b1454575120e3265d2442222299c711ace58ba417532ee4f0fc71b860016b93" +checksum = "3648f3609716eb7dbf5f5b5d4b84fcd67dd4c34efcdb12e4a6c0929c2ac48349" dependencies = [ "lazy_static", "libc", @@ -1924,9 +1773,9 @@ checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" [[package]] name = "notify-rust" -version = "4.5.6" +version = "4.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "367e1355a950d3e758e414f3ca1b3981a57a2aa1fa3338eb0059f5b230b6ffa4" +checksum = "a995a3d2834cefa389218e7a35156e8ce544bc95f836900da01ee0b26a07e9d4" dependencies = [ "mac-notification-sys", "serde", @@ -1978,18 +1827,18 @@ dependencies = [ [[package]] name = "num_enum" -version = "0.5.6" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "720d3ea1055e4e4574c0c0b0f8c3fd4f24c4cdaf465948206dea090b57b526ad" +checksum = "cf5395665662ef45796a4ff5486c5d41d29e0c09640af4c5f17fd94ee2c119c9" dependencies = [ "num_enum_derive", ] [[package]] name = "num_enum_derive" -version = "0.5.6" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d992b768490d7fe0d8586d9b5745f6c49f557da6d81dc982b1d167ad4edbb21" +checksum = "3b0498641e53dd6ac1a4f22547548caa6864cc4933784319cd1775271c5a46ce" dependencies = [ "proc-macro-crate 1.1.3", "proc-macro2", @@ -1997,6 +1846,15 @@ dependencies = [ "syn", ] +[[package]] +name = "num_threads" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aba1801fb138d8e85e11d0fc70baf4fe1cdfffda7c6cd34a854905df588e5ed0" +dependencies = [ + "libc", +] + [[package]] name = "objc" version = "0.2.7" @@ -2004,6 +1862,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" dependencies = [ "malloc_buf", + "objc_exception", ] [[package]] @@ -2017,6 +1876,15 @@ dependencies = [ "objc_id", ] +[[package]] +name = "objc_exception" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4" +dependencies = [ + "cc", +] + [[package]] name = "objc_id" version = "0.1.1" @@ -2028,15 +1896,15 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da32515d9f6e6e489d7bc9d84c71b060db7247dc035bbe44eac88cf87486d8d5" +checksum = "87f3e037eac156d1775da914196f0f37741a274155e34a0b7e427c35d2a2ecb9" [[package]] name = "open" -version = "2.1.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a82915836ef43159bb6a3c64d884c42329ccd0b8afdca737cf1e3dd701709dc" +checksum = "9213e7b66aa06a7722828ee2980c1adff22a3922b582baaa1e62e30ca2a6c018" dependencies = [ "pathdiff", "winapi", @@ -2106,20 +1974,11 @@ dependencies = [ "winapi", ] -[[package]] -name = "os_str_bytes" -version = "6.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e22443d1643a904602595ba1cd8f7d896afe56d26712531c5ff73a15b2fbf64" -dependencies = [ - "memchr", -] - [[package]] name = "pango" -version = "0.15.6" +version = "0.15.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78c7420fc01a390ec200da7395b64d705f5d82fe03e5d0708aee422c46538be7" +checksum = "22e4045548659aee5313bde6c582b0d83a627b7904dd20dc2d9ef0895d414e4f" dependencies = [ "bitflags", "glib", @@ -2130,12 +1989,12 @@ dependencies = [ [[package]] name = "pango-sys" -version = "0.15.1" +version = "0.15.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7022c2fb88cd2d9d55e1a708a8c53a3ae8678234c4a54bf623400aeb7f31fac2" +checksum = "d2a00081cde4661982ed91d80ef437c20eacaf6aa1a5962c0279ae194662c3aa" dependencies = [ - "glib-sys 0.15.6", - "gobject-sys 0.15.5", + "glib-sys 0.15.10", + "gobject-sys 0.15.10", "libc", "system-deps 6.0.2", ] @@ -2154,7 +2013,17 @@ checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" dependencies = [ "instant", "lock_api", - "parking_lot_core", + "parking_lot_core 0.8.5", +] + +[[package]] +name = "parking_lot" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f5ec2493a61ac0506c0f4199f99070cbe83857b0337006a30f3e6719b8ef58" +dependencies = [ + "lock_api", + "parking_lot_core 0.9.2", ] [[package]] @@ -2166,11 +2035,24 @@ dependencies = [ "cfg-if", "instant", "libc", - "redox_syscall 0.2.10", + "redox_syscall", "smallvec", "winapi", ] +[[package]] +name = "parking_lot_core" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "995f667a6c822200b0433ac218e05582f0e2efa1b922a3fd2fbaadc5f87bab37" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-sys", +] + [[package]] name = "pathdiff" version = "0.2.1" @@ -2304,9 +2186,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.24" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58893f751c9b0412871a09abd62ecd2a00298c6c83befa223ef98c52aef40cbe" +checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae" [[package]] name = "png" @@ -2322,14 +2204,14 @@ dependencies = [ [[package]] name = "png" -version = "0.16.8" +version = "0.17.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c3287920cb847dee3de33d301c463fba14dda99db24214ddf93f83d3021f4c6" +checksum = "dc38c0ad57efb786dd57b9864e5b18bae478c00c824dc55a38bbc9da95dde3ba" dependencies = [ "bitflags", "crc32fast", - "deflate 0.8.6", - "miniz_oxide 0.3.7", + "deflate 1.0.0", + "miniz_oxide", ] [[package]] @@ -2345,12 +2227,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "pollster" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5da3b0203fd7ee5720aa0b5e790b591aa5d3f41c3ed2c34a3a393382198af2f7" - [[package]] name = "ppv-lite86" version = "0.2.16" @@ -2414,18 +2290,18 @@ checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" [[package]] name = "proc-macro2" -version = "1.0.36" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7342d5883fbccae1cc37a2353b09c87c9b0f3afd73f5fb9bba687a1f733b029" +checksum = "ec757218438d5fda206afc041538b2f6d889286160d649a86a24d37e1235afd1" dependencies = [ "unicode-xid", ] [[package]] name = "quote" -version = "1.0.15" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "864d3e96a899863136fc6e99f3d7cae289dafe43bf2c5ac19b70df7210c0a145" +checksum = "a1feb54ed693b93a84e14094943b84b7c4eae204c512b7ccb95ab0c66d278ad1" dependencies = [ "proc-macro2", ] @@ -2490,7 +2366,7 @@ version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" dependencies = [ - "getrandom 0.2.5", + "getrandom 0.2.6", ] [[package]] @@ -2513,79 +2389,38 @@ dependencies = [ [[package]] name = "raw-window-handle" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fba75eee94a9d5273a68c9e1e105d9cffe1ef700532325788389e5a83e2522b7" +checksum = "b800beb9b6e7d2df1fe337c9e3d04e3af22a124460fb4c30fcc22c9117cefb41" dependencies = [ "cty", ] -[[package]] -name = "rayon" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06aca804d41dbc8ba42dfd964f0d01334eceb64314b9ecf7c5fad5188a06d90" -dependencies = [ - "autocfg", - "crossbeam-deque", - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d78120e2c850279833f1dd3582f730c4ab53ed95aeaaaa862a2a5c71b1656d8e" -dependencies = [ - "crossbeam-channel", - "crossbeam-deque", - "crossbeam-utils", - "lazy_static", - "num_cpus", -] - [[package]] name = "redox_syscall" -version = "0.1.57" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" - -[[package]] -name = "redox_syscall" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8383f39639269cde97d255a32bdb68c047337295414940c68bdd30c2e13203ff" +checksum = "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42" dependencies = [ "bitflags", ] [[package]] name = "redox_users" -version = "0.3.5" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de0737333e7a9502c789a36d7c7fa6092a49895d4faa31ca5df163857ded2e9d" +checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" dependencies = [ - "getrandom 0.1.16", - "redox_syscall 0.1.57", - "rust-argon2", -] - -[[package]] -name = "redox_users" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "528532f3d801c87aec9def2add9ca802fe569e44a544afe633765267840abe64" -dependencies = [ - "getrandom 0.2.5", - "redox_syscall 0.2.10", + "getrandom 0.2.6", + "redox_syscall", + "thiserror", ] [[package]] name = "regex" -version = "1.5.4" +version = "1.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461" +checksum = "1a11647b6b25ff05a515cb92c365cec08801e83423a235b51e231e1808747286" dependencies = [ "aho-corasick", "memchr", @@ -2618,15 +2453,14 @@ dependencies = [ [[package]] name = "rfd" -version = "0.7.0" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2aaf1d71ccd44689f7c2c72da1117fd8db71f72a76fe9b5c5dbb17ab903007e0" +checksum = "92e3107b2e81967df7c0617e978dc656795583a73ad0ddbf645ce60109caf8c2" dependencies = [ - "ashpd", "block", "dispatch", - "glib-sys 0.15.6", - "gobject-sys 0.15.5", + "glib-sys 0.15.10", + "gobject-sys 0.15.10", "gtk-sys", "js-sys", "lazy_static", @@ -2634,24 +2468,11 @@ dependencies = [ "objc", "objc-foundation", "objc_id", - "pollster", "raw-window-handle", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "windows 0.30.0", -] - -[[package]] -name = "rust-argon2" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b18820d944b33caa75a71378964ac46f58517c92b6ae5f762636247c09e78fb" -dependencies = [ - "base64", - "blake2b_simd", - "constant_time_eq", - "crossbeam-utils", + "windows 0.35.0", ] [[package]] @@ -2669,7 +2490,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ - "semver 1.0.6", + "semver 1.0.7", ] [[package]] @@ -2769,9 +2590,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.6" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a3381e03edd24287172047536f20cabde766e2cd3e65e6b00fb3af51c4f38d" +checksum = "d65bd28f48be7196d222d95b9243287f48d27aca604e08497513019ff0502cc4" [[package]] name = "semver-parser" @@ -2838,9 +2659,9 @@ dependencies = [ [[package]] name = "serde_with" -version = "1.12.0" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec1e6ec4d8950e5b1e894eac0d360742f3b1407a6078a604a731c4b3f49cefbc" +checksum = "946fa04a8ac43ff78a1f4b811990afb9ddbdf5890b46d6dda0ba1998230138b7" dependencies = [ "rustversion", "serde", @@ -2849,11 +2670,11 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "1.5.1" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12e47be9471c72889ebafb5e14d5ff930d89ae7a67bbdb5f8abb564f845a927e" +checksum = "e182d6ec6f05393cc0e5ed1bf81ad6db3a8feedf8ee515ecdd369809bcce8082" dependencies = [ - "darling 0.13.1", + "darling 0.13.4", "proc-macro2", "quote", "syn", @@ -2938,15 +2759,15 @@ dependencies = [ [[package]] name = "siphasher" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a86232ab60fa71287d7f2ddae4a7073f6b7aac33631c3015abb556f08c6d0a3e" +checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" [[package]] name = "slab" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9def91fd1e018fe007022791f865d0ccc9b3a0d5001e01aabb8b40e46000afb5" +checksum = "eb703cfe953bccee95685111adeedb76fabe4e97549a58d16f03ea7b9367bb32" [[package]] name = "smallvec" @@ -3001,13 +2822,13 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "string_cache" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33994d0838dc2d152d17a62adf608a869b5e846b65b389af7f3dbc1de45c5b26" +checksum = "213494b7a2b503146286049378ce02b482200519accc31872ee8be91fa820a08" dependencies = [ - "lazy_static", "new_debug_unreachable", - "parking_lot", + "once_cell", + "parking_lot 0.12.0", "phf_shared 0.10.0", "precomputed-hash", "serde", @@ -3015,12 +2836,12 @@ dependencies = [ [[package]] name = "string_cache_codegen" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f24c8e5e19d22a726626f1a5e16fe15b132dcf21d10177fa5a45ce7962996b97" +checksum = "6bb30289b722be4ff74a408c3cc27edeaad656e06cb1fe8fa9231fa59c728988" dependencies = [ - "phf_generator 0.8.0", - "phf_shared 0.8.0", + "phf_generator 0.10.0", + "phf_shared 0.10.0", "proc-macro2", "quote", ] @@ -3076,17 +2897,11 @@ dependencies = [ "syn", ] -[[package]] -name = "subtle" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" - [[package]] name = "syn" -version = "1.0.86" +version = "1.0.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a65b3f4ffa0092e9887669db0eae07941f023991ab58ea44da8fe8e2d511c6b" +checksum = "b683b2b825c8eef438b77c36a06dc262294da3d5a5813fac20da149241dcd44d" dependencies = [ "proc-macro2", "quote", @@ -3139,9 +2954,9 @@ dependencies = [ [[package]] name = "tao" -version = "0.6.2" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b3b3bbc9151bce45db3cf9ccb808730c8df8786d0223f34591f6e5890503939" +checksum = "2b6a3359088d4c4735a13f933202f4ecd91f5991b41a8eb757f2449c044ce925" dependencies = [ "bitflags", "cairo-rs", @@ -3157,7 +2972,7 @@ dependencies = [ "gdkx11-sys", "gio", "glib", - "glib-sys 0.15.6", + "glib-sys 0.15.10", "gtk", "instant", "lazy_static", @@ -3167,7 +2982,7 @@ dependencies = [ "ndk-glue", "ndk-sys", "objc", - "parking_lot", + "parking_lot 0.11.2", "raw-window-handle", "scopeguard", "serde", @@ -3203,14 +3018,14 @@ dependencies = [ [[package]] name = "tauri" -version = "1.0.0-rc.3" -source = "git+https://github.com/Weiyi-Feng/tauri.git#015e15cfd00cebe8d23cd9170493227c61cc4322" +version = "1.0.0-rc.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6d514a34b3f9a07e2002d95e1371b42a446636e3d571a59e974b21d6acf3007" dependencies = [ "anyhow", "attohttpc", "bincode", "cfg_aliases", - "clap", "dirs-next", "either", "embed_plist", @@ -3233,7 +3048,7 @@ dependencies = [ "raw-window-handle", "regex", "rfd", - "semver 1.0.6", + "semver 1.0.7", "serde", "serde_json", "serde_repr", @@ -3244,65 +3059,69 @@ dependencies = [ "tauri-macros", "tauri-runtime", "tauri-runtime-wry", - "tauri-utils 1.0.0-rc.2", + "tauri-utils", "tempfile", "thiserror", "tokio", "url", "uuid", - "zip", + "windows 0.30.0", ] [[package]] name = "tauri-build" -version = "1.0.0-rc.3" +version = "1.0.0-rc.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "855e47d8cfb2219fc14d2eed2c09bfb35f9ecd71a40ca2084aeeee2d23e0b60d" +checksum = "ede6462a4692e2fd5030497ad576264dc90eea5fa337182492e77291d45fc78b" dependencies = [ "anyhow", "cargo_toml", "serde_json", - "tauri-utils 1.0.0-rc.3", + "tauri-utils", "winres", ] [[package]] name = "tauri-codegen" -version = "1.0.0-rc.2" -source = "git+https://github.com/Weiyi-Feng/tauri.git#015e15cfd00cebe8d23cd9170493227c61cc4322" +version = "1.0.0-rc.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54193ebdb010e85824301ce5f0940742b680d66376203f6425d549d2f32ad499" dependencies = [ "base64", - "blake3", + "brotli", + "ico", + "png 0.17.5", "proc-macro2", "quote", "regex", "serde", "serde_json", "sha2", - "tauri-utils 1.0.0-rc.2", + "tauri-utils", "thiserror", "uuid", "walkdir", - "zstd", ] [[package]] name = "tauri-macros" -version = "1.0.0-rc.2" -source = "git+https://github.com/Weiyi-Feng/tauri.git#015e15cfd00cebe8d23cd9170493227c61cc4322" +version = "1.0.0-rc.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8b867ef4703cb8e50f128ee3c941895d94c01e0ebd9007a7b45ecca52516dbf" dependencies = [ "heck 0.4.0", "proc-macro2", "quote", "syn", "tauri-codegen", - "tauri-utils 1.0.0-rc.2", + "tauri-utils", ] [[package]] name = "tauri-runtime" -version = "0.3.2" -source = "git+https://github.com/Weiyi-Feng/tauri.git#015e15cfd00cebe8d23cd9170493227c61cc4322" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b289ac8eafc52a36425fcaf3de23febd0b2606d3cce2b39ac412a1817fae537" dependencies = [ "gtk", "http", @@ -3310,7 +3129,7 @@ dependencies = [ "infer", "serde", "serde_json", - "tauri-utils 1.0.0-rc.2", + "tauri-utils", "thiserror", "uuid", "webview2-com", @@ -3319,15 +3138,14 @@ dependencies = [ [[package]] name = "tauri-runtime-wry" -version = "0.3.2" -source = "git+https://github.com/Weiyi-Feng/tauri.git#015e15cfd00cebe8d23cd9170493227c61cc4322" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8bf16e0476a8249aa2c75e7b49ec4c059be5fb27d9f6514e30ed327e8e9fa2" dependencies = [ "gtk", - "ico", - "infer", - "png 0.16.8", + "rand 0.8.5", "tauri-runtime", - "tauri-utils 1.0.0-rc.2", + "tauri-utils", "uuid", "webview2-com", "windows 0.30.0", @@ -3336,32 +3154,11 @@ dependencies = [ [[package]] name = "tauri-utils" -version = "1.0.0-rc.2" -source = "git+https://github.com/Weiyi-Feng/tauri.git#015e15cfd00cebe8d23cd9170493227c61cc4322" -dependencies = [ - "ctor", - "heck 0.4.0", - "html5ever", - "json-patch", - "kuchiki", - "phf 0.10.1", - "proc-macro2", - "quote", - "serde", - "serde_json", - "serde_with", - "serialize-to-javascript", - "thiserror", - "url", - "zstd", -] - -[[package]] -name = "tauri-utils" -version = "1.0.0-rc.3" +version = "1.0.0-rc.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21f11483d205c77d1ec398e80566485101696335983e69832cc6c41ab1e07266" +checksum = "a67fcf8fdd1340de4e75c01966fceab03057a8b0e97864eb39a21e420deed503" dependencies = [ + "brotli", "ctor", "glob", "heck 0.4.0", @@ -3389,37 +3186,22 @@ dependencies = [ "cfg-if", "fastrand", "libc", - "redox_syscall 0.2.10", + "redox_syscall", "remove_dir_all", "winapi", ] [[package]] name = "tendril" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9ef557cb397a4f0a5a3a628f06515f78563f2209e64d47055d9dc6052bf5e33" +checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0" dependencies = [ "futf", "mac", "utf-8", ] -[[package]] -name = "termcolor" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dfed899f0eb03f32ee8c6a0aabdb8a7949659e3466561fc0adf54e26d88c5f4" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "textwrap" -version = "0.14.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0066c8d12af8b5acd21e00547c3797fde4e8677254a7ee429176ccebbe93dd80" - [[package]] name = "thin-slice" version = "0.1.1" @@ -3457,12 +3239,12 @@ dependencies = [ [[package]] name = "time" -version = "0.1.43" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438" +checksum = "c2702e08a7a860f005826c6815dcac101b19b5eb330c27fe4a5928fec1d20ddd" dependencies = [ "libc", - "winapi", + "num_threads", ] [[package]] @@ -3494,18 +3276,18 @@ dependencies = [ [[package]] name = "toml" -version = "0.5.8" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31142970826733df8241ef35dc040ef98c679ab14d7c3e54d827099b3acecaa" +checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7" dependencies = [ "serde", ] [[package]] name = "tracing" -version = "0.1.31" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6c650a8ef0cd2dd93736f033d21cbd1224c5a967aa0c258d00fcf7dafef9b9f" +checksum = "5d0ecdcb44a79f0fe9844f0c4f33a342cbcbb5117de8001e6ba0dc2351327d09" dependencies = [ "cfg-if", "pin-project-lite", @@ -3515,9 +3297,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.19" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8276d9a4a3a558d7b7ad5303ad50b53d58264641b82914b7ada36bd762e7a716" +checksum = "2e65ce065b4b5c53e73bb28912318cb8c9e9ad3921f1d669eb0e68b4c8143a2b" dependencies = [ "proc-macro2", "quote", @@ -3526,9 +3308,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.22" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03cfcb51380632a72d3111cb8d3447a8d908e577d31beeac006f836383d29a23" +checksum = "f54c8ca710e81886d498c2fd3331b56c93aa248d49de2222ad2742247c60072f" dependencies = [ "lazy_static", "valuable", @@ -3547,9 +3329,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.9" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e0ab7bdc962035a87fba73f3acca9b8a8d0034c2e6f60b84aeaaddddc155dce" +checksum = "4bc28f93baff38037f64e6f43d34cfa1605f27a49c34e8a04c5e78b0babf2596" dependencies = [ "ansi_term", "lazy_static", @@ -3636,7 +3418,7 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" dependencies = [ - "getrandom 0.2.5", + "getrandom 0.2.6", ] [[package]] @@ -3700,9 +3482,9 @@ checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" [[package]] name = "wasm-bindgen" -version = "0.2.79" +version = "0.2.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25f1af7423d8588a3d840681122e72e6a24ddbcb3f0ec385cac0d12d24256c06" +checksum = "27370197c907c55e3f1a9fbe26f44e937fe6451368324e009cba39e139dc08ad" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -3710,9 +3492,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.79" +version = "0.2.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b21c0df030f5a177f3cba22e9bc4322695ec43e7257d865302900290bcdedca" +checksum = "53e04185bfa3a779273da532f5025e33398409573f348985af9a1cbf3774d3f4" dependencies = [ "bumpalo", "lazy_static", @@ -3725,9 +3507,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.29" +version = "0.4.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2eb6ec270a31b1d3c7e266b999739109abce8b6c87e4b31fcfcd788b65267395" +checksum = "6f741de44b75e14c35df886aff5f1eb73aa114fa5d4d00dcd37b5e01259bf3b2" dependencies = [ "cfg-if", "js-sys", @@ -3737,9 +3519,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.79" +version = "0.2.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f4203d69e40a52ee523b2529a773d5ffc1dc0071801c87b3d270b471b80ed01" +checksum = "17cae7ff784d7e83a2fe7611cfe766ecf034111b49deb850a3dc7699c08251f5" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3747,9 +3529,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.79" +version = "0.2.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa8a30d46208db204854cadbb5d4baf5fcf8071ba5bf48190c3e59937962ebc" +checksum = "99ec0dc7a4756fffc231aab1b9f2f578d23cd391390ab27f952ae0c9b3ece20b" dependencies = [ "proc-macro2", "quote", @@ -3760,15 +3542,15 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.79" +version = "0.2.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d958d035c4438e28c70e4321a2911302f10135ce78a9c7834c0cab4123d06a2" +checksum = "d554b7f530dee5964d9a9468d95c1f8b8acae4f282807e7d27d4b03099a46744" [[package]] name = "web-sys" -version = "0.3.56" +version = "0.3.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c060b319f29dd25724f09a2ba1418f142f539b2be99fbf4d2d5a8f7330afb8eb" +checksum = "7b17e741662c70c8bd24ac5c5b18de314a2c26c32bf8346ee1e6f53de919c283" dependencies = [ "js-sys", "wasm-bindgen", @@ -3785,10 +3567,10 @@ dependencies = [ "gdk", "gdk-sys", "gio", - "gio-sys 0.15.6", + "gio-sys 0.15.10", "glib", - "glib-sys 0.15.6", - "gobject-sys 0.15.5", + "glib-sys 0.15.10", + "gobject-sys 0.15.10", "gtk", "gtk-sys", "javascriptcore-rs", @@ -3808,9 +3590,9 @@ dependencies = [ "cairo-sys-rs", "gdk-pixbuf-sys", "gdk-sys", - "gio-sys 0.15.6", - "glib-sys 0.15.6", - "gobject-sys 0.15.5", + "gio-sys 0.15.10", + "glib-sys 0.15.10", + "gobject-sys 0.15.10", "gtk-sys", "javascriptcore-rs-sys", "libc", @@ -3921,13 +3703,26 @@ version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b749ebd2304aa012c5992d11a25d07b406bdbe5f79d371cb7a918ce501a19eb0" dependencies = [ - "windows_aarch64_msvc", + "windows_aarch64_msvc 0.30.0", "windows_i686_gnu 0.30.0", "windows_i686_msvc 0.30.0", "windows_x86_64_gnu 0.30.0", "windows_x86_64_msvc 0.30.0", ] +[[package]] +name = "windows" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08746b4b7ac95f708b3cccceb97b7f9a21a8916dd47fc99b0e6aaf7208f26fd7" +dependencies = [ + "windows_aarch64_msvc 0.35.0", + "windows_i686_gnu 0.35.0", + "windows_i686_msvc 0.35.0", + "windows_x86_64_gnu 0.35.0", + "windows_x86_64_msvc 0.35.0", +] + [[package]] name = "windows-bindgen" version = "0.30.0" @@ -3938,12 +3733,37 @@ dependencies = [ "windows_reader", ] +[[package]] +name = "windows-sys" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5acdd78cb4ba54c0045ac14f62d8f94a03d10047904ae2a40afa1e99d8f70825" +dependencies = [ + "windows_aarch64_msvc 0.34.0", + "windows_i686_gnu 0.34.0", + "windows_i686_msvc 0.34.0", + "windows_x86_64_gnu 0.34.0", + "windows_x86_64_msvc 0.34.0", +] + [[package]] name = "windows_aarch64_msvc" version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "29277a4435d642f775f63c7d1faeb927adba532886ce0287bd985bffb16b6bca" +[[package]] +name = "windows_aarch64_msvc" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17cffbe740121affb56fad0fc0e421804adf0ae00891205213b5cecd30db881d" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db3bc5134e8ce0da5d64dcec3529793f1d33aee5a51fc2b4662e0f881dd463e6" + [[package]] name = "windows_gen" version = "0.30.0" @@ -3966,6 +3786,18 @@ version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1145e1989da93956c68d1864f32fb97c8f561a8f89a5125f6a2b7ea75524e4b8" +[[package]] +name = "windows_i686_gnu" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2564fde759adb79129d9b4f54be42b32c89970c18ebf93124ca8870a498688ed" + +[[package]] +name = "windows_i686_gnu" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0343a6f35bf43a07b009b8591b78b10ea03de86b06f48e28c96206cd0f453b50" + [[package]] name = "windows_i686_msvc" version = "0.24.0" @@ -3978,6 +3810,18 @@ version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4a09e3a0d4753b73019db171c1339cd4362c8c44baf1bcea336235e955954a6" +[[package]] +name = "windows_i686_msvc" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cd9d32ba70453522332c14d38814bceeb747d80b3958676007acadd7e166956" + +[[package]] +name = "windows_i686_msvc" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1acdcbf4ca63d8e7a501be86fee744347186275ec2754d129ddeab7a1e3a02e4" + [[package]] name = "windows_macros" version = "0.30.0" @@ -4014,6 +3858,18 @@ version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ca64fcb0220d58db4c119e050e7af03c69e6f4f415ef69ec1773d9aab422d5a" +[[package]] +name = "windows_x86_64_gnu" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfce6deae227ee8d356d19effc141a509cc503dfd1f850622ec4b0f84428e1f4" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "893c0924c5a990ec73cd2264d1c0cba1773a929e1a3f5dbccffd769f8c4edebb" + [[package]] name = "windows_x86_64_msvc" version = "0.24.0" @@ -4026,6 +3882,18 @@ version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08cabc9f0066848fef4bc6a1c1668e6efce38b661d2aeec75d18d8617eebb5f1" +[[package]] +name = "windows_x86_64_msvc" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d19538ccc21819d01deaf88d6a17eae6596a12e9aafdbb97916fb49896d89de9" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a29bd61f32889c822c99a8fdf2e93378bd2fae4d7efd2693fab09fcaaf7eff4b" + [[package]] name = "winres" version = "0.1.12" @@ -4048,10 +3916,11 @@ dependencies = [ [[package]] name = "wry" -version = "0.13.3" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9514586e5c964d30cc7123c9aea9880ff7b3cb1c43f6a1dc8703941eb72ac89f" +checksum = "6fd09ffc86ecea0a0d5f50cc8e4a8121a1bfc0b0825a160f86ac39e86979344c" dependencies = [ + "block", "cocoa", "core-graphics", "gdk", @@ -4059,6 +3928,7 @@ dependencies = [ "glib", "gtk", "http", + "jni", "libc", "log", "objc", @@ -4173,49 +4043,6 @@ dependencies = [ "zvariant", ] -[[package]] -name = "zip" -version = "0.5.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93ab48844d61251bb3835145c521d88aa4031d7139e8485990f60ca911fa0815" -dependencies = [ - "byteorder", - "bzip2", - "crc32fast", - "flate2", - "thiserror", - "time", -] - -[[package]] -name = "zstd" -version = "0.10.0+zstd.1.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b1365becbe415f3f0fcd024e2f7b45bacfb5bdd055f0dc113571394114e7bdd" -dependencies = [ - "zstd-safe", -] - -[[package]] -name = "zstd-safe" -version = "4.1.4+zstd.1.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f7cd17c9af1a4d6c24beb1cc54b17e2ef7b593dc92f19e9d9acad8b182bbaee" -dependencies = [ - "libc", - "zstd-sys", -] - -[[package]] -name = "zstd-sys" -version = "1.6.3+zstd.1.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc49afa5c8d634e75761feda8c592051e7eeb4683ba827211eb0d731d3402ea8" -dependencies = [ - "cc", - "libc", -] - [[package]] name = "zvariant" version = "3.1.2" diff --git a/misc/config_tools/configurator/src-tauri/Cargo.toml b/misc/config_tools/configurator/src-tauri/Cargo.toml index 01dadc0f5..56e3c483b 100644 --- a/misc/config_tools/configurator/src-tauri/Cargo.toml +++ b/misc/config_tools/configurator/src-tauri/Cargo.toml @@ -12,17 +12,16 @@ rust-version = "1.57" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [build-dependencies] -tauri-build = { version = "1.0.0-rc.3", features = [] } +tauri-build = { version = "1.0.0-rc.5", features = [] } [dependencies] serde_json = "1.0" serde = { version = "1.0", features = ["derive"] } -tauri = { git = "https://github.com/Weiyi-Feng/tauri.git", features = ["api-all", "cli"] } -log = "0.4.14" -env_logger = "0.9.0" -glob = "0.3.0" -dirs = "4.0.0" -itertools = "0.10.3" +tauri = { version = "1.0.0-rc.6", features = ["api-all"] } +log = "0.4" +glob = "0.3" +dirs = "4.0" +itertools = "0.10" [features] # by default Tauri runs in production mode diff --git a/misc/config_tools/configurator/src-tauri/src/configurator.rs b/misc/config_tools/configurator/src-tauri/src/configurator.rs index abcdf386d..191249158 100644 --- a/misc/config_tools/configurator/src-tauri/src/configurator.rs +++ b/misc/config_tools/configurator/src-tauri/src/configurator.rs @@ -1,5 +1,4 @@ use std::borrow::Borrow; -use std::fs; use std::ops::Add; use std::path::{Path, PathBuf}; @@ -7,6 +6,12 @@ use serde::{Deserialize, Serialize}; use glob::{glob_with, MatchOptions}; use itertools::Itertools; + +use std::fs::{self, File}; +use std::io; +use std::io::prelude::*; + + #[derive(Serialize, Deserialize, Clone, Copy, Debug)] #[repr(u16)] #[non_exhaustive] @@ -178,8 +183,8 @@ impl Configurator { } } - pub fn add_history(&mut self, history_type: HistoryType, path: &Path) { - let path_string: String = path.to_string_lossy().parse().unwrap(); + pub fn add_history(&mut self, history_type: HistoryType, history_path: &Path) { + let path_string: String = history_path.to_string_lossy().parse().unwrap(); match history_type { HistoryType::WorkingFolder => { self.config_data.history.working_folder.insert(0, path_string); @@ -266,8 +271,8 @@ pub fn get_history(history_type: HistoryType) -> Result { } #[tauri::command] -pub fn add_history(history_type: HistoryType, path: String) -> Result<(), &'static str> { - let path_buf = Path::new(&path); +pub fn add_history(history_type: HistoryType, history_path: String) -> Result<(), &'static str> { + let path_buf = Path::new(&history_path); if !(path_buf.is_dir() || path_buf.is_file()) { return Err("Not a validate dir or file path."); } @@ -313,4 +318,69 @@ pub fn get_home() -> Result { Ok(path.to_str().unwrap().to_string()) } } -} \ No newline at end of file +} + +#[derive(Serialize)] +pub struct DirEntry { + path: String, + children: Option>, +} + +#[tauri::command] +pub fn acrn_read(file_path: &str) -> Result { + let mut file = File::open(file_path).map_err(|e| e.to_string())?; + let mut contents = String::new(); + file + .read_to_string(&mut contents) + .map_err(|e| e.to_string())?; + Ok(contents) +} + +#[tauri::command] +pub fn acrn_write(file_path: &str, contents: &str) -> Result<(), String> { + let mut file = File::create(file_path).map_err(|e| e.to_string())?; + file + .write_all(contents.as_bytes()) + .map_err(|e| e.to_string())?; + Ok(()) +} + +#[tauri::command] +pub fn acrn_is_file(path: &str) -> bool { + fs::metadata(path) + .map(|metadata| metadata.is_file()) + .unwrap_or(false) +} + +#[tauri::command] +pub fn acrn_create_dir(path: &str) -> Result<(), String> { + fs::create_dir(path).map_err(|e| e.to_string()) +} + +fn read_dir>( + path: P, + recursive: bool, +) -> io::Result> { + let path = path.as_ref(); + let mut entries = Vec::new(); + for entry in fs::read_dir(path)? { + let entry = entry?; + let path = entry.path().to_str().unwrap().to_string(); + let children = if recursive && entry.file_type()?.is_dir() { + Some(read_dir(&path, true)?) + } else { + None + }; + entries.push(DirEntry { path, children }); + } + Ok(entries) +} + +#[tauri::command] +pub fn acrn_read_dir( + path: &str, + recursive: bool, +) -> Result, String> { + read_dir(path, recursive).map_err(|e| e.to_string()) +} + diff --git a/misc/config_tools/configurator/src-tauri/src/filesystem.rs b/misc/config_tools/configurator/src-tauri/src/filesystem.rs deleted file mode 100644 index ceba9adbe..000000000 --- a/misc/config_tools/configurator/src-tauri/src/filesystem.rs +++ /dev/null @@ -1,102 +0,0 @@ -use serde::Serialize; -use std::fs::{self, File}; -use std::io; -use std::io::prelude::*; -use std::path::Path; - -#[tauri::command] -pub fn fs_read_text_file(path: &str) -> Result { - let mut file = File::open(path).map_err(|e| e.to_string())?; - let mut contents = String::new(); - file - .read_to_string(&mut contents) - .map_err(|e| e.to_string())?; - Ok(contents) -} - -#[tauri::command] -pub fn fs_write_text_file(path: &str, contents: &str) -> Result<(), String> { - let mut file = File::create(path).map_err(|e| e.to_string())?; - file - .write_all(contents.as_bytes()) - .map_err(|e| e.to_string())?; - Ok(()) -} - -#[tauri::command] -pub fn fs_read_binary_file(path: &str) -> Result, String> { - let mut file = File::open(path).map_err(|e| e.to_string())?; - let mut contents = Vec::new(); - file.read_to_end(&mut contents).map_err(|e| e.to_string())?; - Ok(contents) -} - -#[tauri::command] -pub fn fs_write_binary_file(path: &str, contents: &[u8]) -> Result<(), String> { - let mut file = File::create(path).map_err(|e| e.to_string())?; - file.write_all(contents).map_err(|e| e.to_string())?; - Ok(()) -} - -#[derive(Serialize)] -pub struct DirEntry { - path: String, - children: Option>, -} - -fn read_dir>( - path: P, - recursive: bool, -) -> io::Result> { - let path = path.as_ref(); - let mut entries = Vec::new(); - for entry in fs::read_dir(path)? { - let entry = entry?; - let path = entry.path().to_str().unwrap().to_string(); - let children = if recursive && entry.file_type()?.is_dir() { - Some(read_dir(&path, true)?) - } else { - None - }; - entries.push(DirEntry { path, children }); - } - Ok(entries) -} - -#[tauri::command] -pub fn fs_read_dir( - path: &str, - recursive: bool, -) -> Result, String> { - read_dir(path, recursive).map_err(|e| e.to_string()) -} - -#[tauri::command] -pub fn fs_rename(from: &str, to: &str) -> Result<(), String> { - fs::rename(from, to).map_err(|e| e.to_string()) -} - -#[tauri::command] -pub fn fs_delete_file(path: &str) -> Result<(), String> { - fs::remove_file(path).map_err(|e| e.to_string()) -} - -#[tauri::command] -pub fn fs_delete_dir(path: &str) -> Result<(), String> { - fs::remove_dir_all(path).map_err(|e| e.to_string()) -} - -#[tauri::command] -pub fn fs_create_dir(path: &str) -> Result<(), String> { - fs::create_dir(path).map_err(|e| e.to_string()) -} - -#[tauri::command] -pub fn fs_is_file(path: &str) -> bool { - fs::metadata(path).map(|m| m.is_file()).unwrap_or(false) -} - -#[tauri::command] -pub fn fs_is_dir(path: &str) -> bool { - fs::metadata(path).map(|m| m.is_dir()).unwrap_or(false) -} \ No newline at end of file diff --git a/misc/config_tools/configurator/src-tauri/src/main.rs b/misc/config_tools/configurator/src-tauri/src/main.rs index 4b2eff6ed..cb147abc6 100644 --- a/misc/config_tools/configurator/src-tauri/src/main.rs +++ b/misc/config_tools/configurator/src-tauri/src/main.rs @@ -3,78 +3,24 @@ all(not(debug_assertions), target_os = "windows"), windows_subsystem = "windows" )] -mod filesystem; mod configurator; -use log::*; - -use tauri::{api::cli::get_matches, utils::config::CliConfig, PackageInfo, RunEvent}; fn main() { - env_logger::init(); - // Init context - let context = tauri::generate_context!(); - - // Build app instance and run - let app = tauri::Builder::default() + tauri::Builder::default() .invoke_handler(tauri::generate_handler![ - filesystem::fs_rename, - filesystem::fs_read_dir, - filesystem::fs_read_text_file, - filesystem::fs_read_binary_file, - filesystem::fs_write_text_file, - filesystem::fs_write_binary_file, - filesystem::fs_read_dir, - filesystem::fs_delete_file, - filesystem::fs_delete_dir, - filesystem::fs_create_dir, - filesystem::fs_is_file, - filesystem::fs_is_dir, configurator::get_history, configurator::add_history, configurator::set_working_folder, configurator::write_board, configurator::force_reset, - configurator::get_home - ]) - .setup(|app| { - // Handle cli cmdline - let app_config = app.config(); - let cli_config = app_config.tauri.cli.as_ref().unwrap(); - let package_info = app.package_info(); - handle_cli_arg_data(&cli_config, &package_info); - Ok(()) - }) - .build(context) + configurator::get_home, + configurator::acrn_read, + configurator::acrn_write, + configurator::acrn_is_file, + configurator::acrn_read_dir, + configurator::acrn_create_dir, + ]) + .run(tauri::generate_context!()) .expect("error while running tauri application"); - - app.run(|_app, event| { - if let RunEvent::Exit = event { - info!("Received Exit event"); - } - }); } - - -fn handle_cli_arg_data(cli_config: &CliConfig, pkg_info: &PackageInfo) { - match get_matches(cli_config, pkg_info) { - Ok(matches) => { - let mut exit_flag = false; - if let Some(arg_data) = matches.args.get("help") { - println!("{}", arg_data.value.as_str().unwrap_or("No help available")); - exit_flag = true; - } - if let Some(arg_data) = matches.args.get("version") { - println!("{}", arg_data.value.as_str().unwrap_or("No version data available")); - exit_flag = true - } - if exit_flag { - std::process::exit(1); - } - } - Err(e) => { - error!("{}", e.to_string()); - std::process::exit(1); - } - } -} \ No newline at end of file diff --git a/misc/config_tools/configurator/src-tauri/tauri.conf.json b/misc/config_tools/configurator/src-tauri/tauri.conf.json new file mode 100644 index 000000000..d2b99d2da --- /dev/null +++ b/misc/config_tools/configurator/src-tauri/tauri.conf.json @@ -0,0 +1 @@ +{"package":{"productName":"acrn-configurator","version":"../package.json"},"build":{"distDir":"../build","devPath":"http://localhost:3000","beforeDevCommand":"","beforeBuildCommand":""},"tauri":{"bundle":{"active":true,"targets":"all","identifier":"com.projectacrn.configurator","icon":["icons/32x32.png","icons/128x128.png","icons/128x128@2x.png","icons/icon.icns","icons/icon.ico"],"resources":[],"externalBin":[],"copyright":"","category":"DeveloperTool","shortDescription":"","longDescription":"","deb":{"depends":[],"useBootstrapper":false},"macOS":{"frameworks":[],"useBootstrapper":false,"exceptionDomain":"","signingIdentity":null,"providerShortName":null,"entitlements":null},"windows":{"certificateThumbprint":null,"digestAlgorithm":"sha256","timestampUrl":""}},"updater":{"active":false},"allowlist":{"all":true},"windows":[{"title":"ACRN Configurator","width":1366,"height":768,"resizable":true,"fullscreen":false,"decorations":false}],"security":{"csp":null}}} \ No newline at end of file diff --git a/misc/config_tools/configurator/src-tauri/tauri.json b/misc/config_tools/configurator/src-tauri/tauri.json index e67cfc84e..bb9b7b0da 100644 --- a/misc/config_tools/configurator/src-tauri/tauri.json +++ b/misc/config_tools/configurator/src-tauri/tauri.json @@ -1,5 +1,4 @@ { - "$schema": "types/schema.json", "package": { "productName": "acrn-configurator", "version": "../package.json" @@ -11,18 +10,10 @@ "beforeBuildCommand": "" }, "tauri": { - "cli": { - "args": [ - { - "name": "debug", - "takesValue": false - } - ] - }, "bundle": { "active": true, "targets": "all", - "identifier": "com.tauri.dev", + "identifier": "com.projectacrn.configurator", "icon": [ "icons/32x32.png", "icons/128x128.png", @@ -42,7 +33,6 @@ }, "macOS": { "frameworks": [], - "minimumSystemVersion": "", "useBootstrapper": false, "exceptionDomain": "", "signingIdentity": null, diff --git a/misc/config_tools/configurator/src/ACRNContext.jsx b/misc/config_tools/configurator/src/ACRNContext.jsx deleted file mode 100644 index c77737cc1..000000000 --- a/misc/config_tools/configurator/src/ACRNContext.jsx +++ /dev/null @@ -1,37 +0,0 @@ -import React, {createContext} from 'react' -import {Helper, TauriLocalFSBackend} from "./lib/helper"; -import {Configurator} from "./lib/acrn"; - -// 1. Use React createContext API to create ACRN Context -export const ACRNContext = createContext({ - helper: () => { - }, - configurator: () => { - } -}) - -// 2. Create Context Provider -export class ACRNProvider extends React.Component { - constructor(props) { - super(props); - let fsBackend = new TauriLocalFSBackend() - let helper = new Helper(fsBackend, fsBackend) - let configurator = new Configurator(helper) - this.state = { - helper: helper, - configurator: configurator - } - } - - render() { - console.log(this.state) - return ( - - {this.props.children} - - ) - } -} - -// 3. export Consumer -export const ACRNConsumer = ACRNContext.Consumer diff --git a/misc/config_tools/configurator/src/App.css b/misc/config_tools/configurator/src/App.css deleted file mode 100644 index 126662e34..000000000 --- a/misc/config_tools/configurator/src/App.css +++ /dev/null @@ -1,97 +0,0 @@ -a { - /* Browse for folder… */ - font-family: Roboto, serif; - font-style: normal; - font-weight: bold; - font-size: 16px; - line-height: 19px; - - color: #2A958D; - text-decoration: auto; -} - -@media (min-width: 576px) { - .border-end-sm { - border-right: 1px solid #dee2e6 !important; - } -} - -.btn-lg { - min-height: 50px; - border-radius: 30px; - font-family: Roboto, serif; - font-style: normal; - font-weight: bold; - line-height: 23px; - text-align: center; - text-transform: capitalize; - - color: #FFFFFF; -} - -.btn-primary { - background-color: #007B81; - border-color: #007B81; -} - -.btn-primary:hover { - background-color: #004B50; - border-color: #004B50; -} - -select { - height: 49px; - background-image: url("assets/images/dropdown_arrow.svg") !important; - background-repeat: no-repeat; - background-position: right 0.75rem center; - background-size: 16px 12px; - border: 1px solid #ced4da; - border-radius: 0.25rem; - transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; - appearance: none; -} - -select:focus { - border: 1px solid #69BFAD; - box-sizing: border-box; - box-shadow: 0 0 6px rgba(105, 191, 173, 0.37); - border-radius: 5px; -} - - -.banner-text { - max-width: 594px; - - font-family: Roboto, serif; - font-style: normal; - font-weight: normal; - font-size: 28px; - line-height: 37px; - letter-spacing: -0.175px; - - color: #FFFFFF; -} - -.bg-gray { - background: #F5F5F5; -} - -.text-right { - text-align: right; -} - -table { - width: 100%; -} - -.descInfoBtn { - color: gray; -} - -.descInfoBtn:hover { - color: lightgray; -} - -.rst-paragraph:last-child{ - margin-bottom: 0; -} \ No newline at end of file diff --git a/misc/config_tools/configurator/src/App.jsx b/misc/config_tools/configurator/src/App.jsx deleted file mode 100644 index f6adc1ff3..000000000 --- a/misc/config_tools/configurator/src/App.jsx +++ /dev/null @@ -1,25 +0,0 @@ -import {ACRNProvider} from "./ACRNContext"; -import {HashRouter, Routes, Route} from "react-router-dom"; -import './App.css' -import Welcome from "./pages/Welcome/Welcome"; -import Error from "./pages/Error/Error"; -import Config from "./pages/Config/Config"; - -import "bootstrap/dist/js/bootstrap" - -function App() { - return ( - - - - }/> - }/> - }/> - - - - ) -} - - -export default App diff --git a/misc/config_tools/configurator/src/App.vue b/misc/config_tools/configurator/src/App.vue new file mode 100644 index 000000000..252e258dc --- /dev/null +++ b/misc/config_tools/configurator/src/App.vue @@ -0,0 +1,24 @@ + + + + + diff --git a/misc/config_tools/configurator/src/assets/css/index.scss b/misc/config_tools/configurator/src/assets/css/index.scss new file mode 100644 index 000000000..7d0f2754e --- /dev/null +++ b/misc/config_tools/configurator/src/assets/css/index.scss @@ -0,0 +1,183 @@ +// global +$primary: #007B81; + +// grid padding +$grid-gutter-width: 0; + +// a +$link-decoration: auto; +$link-shade-percentage: 39%; + +// text box fontsize +$input-font-size-lg: 1rem; + + +@import "bootstrap/scss/bootstrap"; +@import 'bootstrap-vue-3/dist/bootstrap-vue-3.css'; + + +.accordion-button { + box-shadow: none; + display: flex; + align-items: baseline; + + &:not(.collapsed) { + background-color: #fff; + box-shadow: none; + + &::before { + background-image: url("/src/assets/images/dropdown_arrow.svg"); + color: #69BFAD; + transform: rotate(0deg); + margin-top: 9px; + } + + &::after { + display: none; + } + } + + // Accordion icon + &::before { + flex-shrink: 0; + width: $accordion-icon-width; + height: $accordion-icon-width; + content: ""; + background-image: url("/src/assets/images/dropdown_arrow.svg"); + background-repeat: no-repeat; + background-size: $accordion-icon-width; + margin: 8px 0 0 5px; + transform: rotate(-90deg); + @include transition($accordion-icon-transition); + } + + &::after { + display: none; + } + + &:focus { + box-shadow: none; + } +} + +.text-pre-line { + white-space: pre-line; +} + +.btn.btn-outline-primary { + color: #007B81; + border-color: #007B81; + background-color: white; +} + +.btn-outline-primary:hover { + color: #004B50; + border-color: #004B50; + background-color: white; +} + +.btn-close-white { + opacity: 1; + filter: none; + background-image: url("data:image/svg+xml,%3Csvg width='18' height='18' viewBox='0 0 18 18' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11.5195 8.99331L17.4644 3.04835C18.1607 2.3521 18.1607 1.21845 17.4644 0.522192C16.7682 -0.174064 15.6345 -0.174064 14.9383 0.522192L8.99331 6.46715L3.04835 0.531118C2.3521 -0.165138 1.21845 -0.165138 0.522192 0.531118C-0.174064 1.22737 -0.174064 2.36102 0.522192 3.05728L6.46715 9.00223L0.522192 14.9472C-0.174064 15.6434 -0.174064 16.7771 0.522192 17.4733C0.87032 17.8215 1.32556 18 1.78081 18C2.23605 18 2.6913 17.8215 3.03942 17.4733L8.98438 11.5284L14.9293 17.4733C15.2775 17.8215 15.7327 18 16.1879 18C16.6432 18 17.0984 17.8215 17.4466 17.4733C18.1428 16.7771 18.1428 15.6434 17.4466 14.9472L11.5195 8.99331Z' fill='white'/%3E%3C/svg%3E%0A"); +} + +@import "vfonts/Roboto.css"; + +a { + /* Browse for folder… */ + font-family: Roboto; + font-style: normal; + font-weight: bold; + font-size: 16px; + line-height: 19px; + + color: #2A958D; + text-decoration: auto; +} + +@media (min-width: 576px) { + .border-end-sm { + border-right: 1px solid #dee2e6 !important; + } +} + +.btn-lg { + min-height: 50px; + border-radius: 30px; + font-family: Roboto; + font-style: normal; + font-weight: bold; + line-height: 23px; + text-align: center; + text-transform: capitalize; + + color: #FFFFFF; +} + +.btn-primary { + background-color: #007B81; + border-color: #007B81; +} + +.btn-primary:hover { + background-color: #004B50; + border-color: #004B50; +} + +select { + height: 49px; + background-image: url("/src/assets/images/dropdown_arrow.svg") !important; + background-repeat: no-repeat; + background-position: right 0.75rem center; + background-size: 16px 12px; + border: 1px solid #ced4da; + border-radius: 0.25rem; + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + appearance: none; +} + +select:focus { + border: 1px solid #69BFAD; + box-sizing: border-box; + box-shadow: 0 0 6px rgba(105, 191, 173, 0.37); + border-radius: 5px; +} + + +.banner-text { + max-width: 594px; + + font-family: Roboto; + font-style: normal; + font-weight: normal; + font-size: 28px; + line-height: 37px; + letter-spacing: -0.175px; + + color: #FFFFFF; +} + +.bg-gray { + background: #F5F5F5; +} + +.text-right { + text-align: right; +} + +table { + width: 100%; +} + +.descInfoBtn { + color: gray; +} + +.descInfoBtn:hover { + color: lightgray; +} + +.rst-paragraph:last-child { + margin-bottom: 0; +} \ No newline at end of file diff --git a/misc/config_tools/configurator/src/assets/fonts/Roboto-Regular.woff b/misc/config_tools/configurator/src/assets/fonts/Roboto-Regular.woff deleted file mode 100644 index b867bd559d0a9b6a4b8ae604fba31bf93b5c588f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68404 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 z 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

V03&^_r__q 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

    +EfHPnyGf zQ)ov6NW%)1r^k`mUrYtj?YNJ{WUn zhox1*@d3$KX%Eg`PZXVWk&;0LWL0OXO5SW;n)VrB>4a_?HiaC`k3E zc|W(xje2_@9762>r=8Bd>b?+Y<=OKScDxHDM<1a9@y;&{%--md{wCg&rHI*8NJI^` zblf9OXq=2_f4SH0=FO1H^{thj!8ch@WZ#Fm zcS(OX5~C^|)28JM*4w$X8i_DW69k@)PqW=I0>d zeVG+ealaaKMCsH~c@1H>H>0@AYy;oj=8uF6oiDj)1;#WGWh<^7p zr^2G*Zc`Y}Qnf=ir>(~NZ6x!v!=dmt8x%)rN*Xm#(zuVG4Nz)VTAt>`9hm($_-SQ? z>WyN~o~D6EEHAgm0TKs}16c#VdXK6<>YoX34H#9B1Fw{|{8{-U_KIIGR_ObFgi<`$BK8+Q*I4=L%{M`z zSbnPweW^2_!H7mHntFM0!}F-wI+T z!gXXnZl2LMXYp~x?^D)>ozfong@n=#tMOgex6NCd!=Crv3*Ns7<8$u1y&*%Jr2-yZ z1~C8ZZ^OOMY@fUAp~)K;Ppp3M(GfUK=`60hF-jq;5`G*%`l#~Wl|j{n;`2D`-q4@F zV6}Q*a3*D=Q`3k?^)K;p(FIcUOuS}S)%K1qGAV0HJU!DV+Sf|0f4A6gWNOBatf zi&R+FEv7|_@MvzSflQUGvxnG;*v=ZAaY2uaxUc(g++c2MGMp#=q@nkQ?|=%1QC)fj zZE7A+S5Juu2bt`1)givj#8||}?3~j<&RZe7XKUDZ>luI-cGh@k!=HZlqndDf*n4}x zdTcV&`@tjoWe1$M)TE^~u7^o)^n3JmwjsNuUXbxj_E&8dBTe(Pq8vTqm?*Ju)yxW1 zUs~FKdei1bbl(jBIhNn$lb%DB7YRQ0C||BgM95ro^aL5JUl90aQBmhr2vYF#ta2GRyM{F66?eH?ZO;TikDf&h7bU{;l zH;JKW-qO0PSAcFowm-)?-$q(L7ArDt<28vC?{QO}nxI*V@mt!mx$>MW%&~@^cPxX0 zA(+FX2*N{7O%oIVMW6ox;S6CrJ;WddqBe zT^ZL)bWNw)=5qm-R}Dp;KdMzdzJ*eU@TKCbQ9N#%|B{$(YRkTeNu-o1?R2SWlZG_= z;gkjOzx;#}Bduc&5+?x$^~R0J7z;acF1e}>X;O8=ZCa8~eY0x{e{q70-QknY@6mF5 zJUbj(FU3sqrje`mGL2IC7o1Js(n|gyT?5vg1*S&7r!=pWvDUfETziqUvpl0BcdlkT`55Zv|zR^Q@rvi9%?h`&SxU(bQ637s|KK@!o`|z zf?YiOodzR~?VL;Uto}7Yu8vNp^vjp>imfn;-;IiJ9YF-j+lkD1P8IBREM7^= zr>m4l|+kgnAk+Td!X-^+rFY`VG1 zALoU3I%*iWZQVw-kesj_3|ze}i#v{?X7%}qUrMEi;dEQHd5WVvviX)y`TFh7JG@g= z7_jMySL=g<3hZ~x8`WPw|F`E?MX5f)0qK1?qc%3>*-AG z*B=RE|DjyoZbrNJMkkE7h$}eW66SmLz%^>B5w;+fr@q?F*dI?C9xp-J+L$+(F(dJ9 z`gG-=PitLXSO0^NTW7o6Ovo!?B+T!v)h%9+?*(1_>7obs%RNSYt3oP`soRHR5GZ~2 zACzf2$B)sFEM+a#%DouX4FRX`m~FrKcLIGmqFZo^I*ja{mmZn1f8M0NwhkyZzf@H% zh%m@5Y1|KbX^+j00&rVH*|sUbLTjq{6?;*y)`@{ytZ!zcm8zDSgGn;%Hc!zk6CXnH zi?v1_$u*`V$Q9Mwbjj7&x36hNOJV-EULzCLz0{!f)%1)TO>HWqrT9&1aZxH%J3FIt z!u6I-V*a{k0g^jf$I8IeET}Kr7BMhBCGD+B>-_XeS+BwI8lX4F!KU1A+_)zS)@!we zn)iOR)a=!As^gmisBuy|>9mG1D{Y+MV3sDgD;6{eaUE5)nwpnId96X83zj4;csLEe z)`Mk}qzD7^Yk`geS1gG3&JPv3iTqJIs4u}5ONikb(k4UU8ii6bF=TL_?F|*C-8Suf zQykHE8>7GaSJ%I1-~HdcQzhOOsNb*2F8H6n2e&`+O2NJJ_?7pM))!wnpZ?y%6Tk!p zfSS}(AT$Yo;!b*9Pua1&Nm~Wt2P+sNpov9HqW-CmJ-=^l%YGe%zmu^mB#WnDdhs4C zU>^yyND=@wcr%;PbZ-D@@+pj}Fij2>S5JBY&!L+f?xG3Io2K24MDI2aIgW;?q(&rG z{lC>|B-)hTP64&ofF?wD_Xy*W0mw2m5X}UqA{Yz;LjenwKQ;DpR-buZC@t2rb=cLj zo}ci2eV<<{UmerXAdZOY2lf{(KWxkhXaE{eGwV6<7)KS)LDNqjM^CnL-<>rF*DKT- z^yc5VXk+fbRa22qnaeko&gPb-FDOCEtI=Ld>C5BnY`ZB0@gg=DGp566GEWIF3JR+J zx$uLy485G`_LPo_bWx;*%>hU--fhf{K4h|*DXq3y3QCrw&GAekK;|$KP)*KryACL+ zU`@%-DgZ|a9U#C74)^>l3j_dXz#=FS7>J6%?L83`LUz(Xe;G?m&Gq}BLl_9fY#OwG zBm&8OgWO?YJR1c3q*x_y@@VEZ6s zqujbKxZf{C!m3mFBh&C*P1kMIwP-haE)m8|Q57M~IEv){ao(>PARKx}*l#G}cvF;9f6Wcp z9jr@5Q&`<#|67*H;6*jfvYbN&a4)RE@KG@WRJ(K$N64NXDZv&EI$|1KI$JD6xKAQ^ zOFK+oZ__>R^|9W*a5ZV!Wi`v%yaD3#z6;Fcqgxf9T#83QQr`fpfsmQxPcWKNr@eJE z*cPKGK)Z(Y^N=e04Pn*o)@}UC?cueo{H}W8tFf~&|AC3E{%E&)a7Ac_0ij+`o+Gpk zts<6FXlV|30`M16O&W(SnWcSs8-N^m<+!ntJq1?OwAF_>B!9mQdQTj;*I9ZDZba)n7dFJ*NVTty zBBQp%RFkEI(9|ISXcaP1Y*Z@qiGs`mzzSncHH;yf|=)tA%zj5Yy;I@>1{ z=!xm-s$GqqycA>tS5#oGD`ttPfq5R*c_reiA#6z(oPM*E*F7_!0K5dOE=uk3 zk(|DD37U*Y9vN`t5ZKH}(GX1!^q*NF0NG~T2nfT2BtCW;iU>(`m5~Q}&MK*tqSgX( z1sU-Z>dlH<>ZNioPR~ItUyBNEbSoI7Nb%yo5)F%_=qz)fGKU;zm$4wmAqJ{QZw=4!VIK(^kV#WUhcprL zf?SvZ#$e<9VdNUL53*?IF*!BRY`82|ZUblazpeyDu3SZ=fEhF$4F=qb7B1A0Q#0yZ z9S-cOW|@GQ!i9*)$e(pw?q z{_Ad)VWZJ6I&)eQPu;^A5Dg%GCA_UE5$q;E>3w<31K+H9e~`UKKdU$@&)igE0B3Hz z8GNY~_fjI6dd$5uQ6Y!$c%G!Wq7dv@e~g55RKuc1B_p)gcq~cGc|ya*No8@YsfxhR?>K*LLzmw=CO?SL>+vrrziy7 zqGPDij@Ft*V5-1NGZIEW_TZ8#@MW3?pYPP3{;*T5&9;qjM1j!09SC_}A>f}tfOyJP; zy#|)LygxY#I4(4VAWlhT?BcZ`s%kEFAn8WhPk^vd0>q+ST0&F<++!FdVRZp-BAqte z0?x+zyI1n5VrNtnN?5Gj1Z2*^DSHTcD=HH3>k42)IVo}dROsJE?pd3RP)W3rSKgmU zJ`|@MG0|Dp??S~AC#L3y*EX)ePCY9|Hf%5*=`Kse()NPj=u_M)BuN$Wko{6S=omta zm)9rIeAgFO!ssWbT*d=8HdrfUp7_1FC~I) z(f;8AIGsfe(LSF@lR<;bQ_r?oIFMLt?7xnq4giV8N(H-Xh2E-49}=?iLKBq8HH0CD zFbnaz1iOLl>Td0jrzD2$yWZ1@!RU!YMlld(P9GW1toR@VK%p#Xy=k0Wb-%L3h^B6IGWcH1HP|mms&%9LJ=YM*1rjkp zB^HX_SSrC_(+B0Da7gimJGePOf!K!`W(&9>DGP(s1yG(d)ng%4{5*HT0n$9#W{{ znH*i%O^a2duV zuwg*nnS$uhQLeic)O9`_6~c|zMIT(RvlNklcBkG^{aI8`Y)1UI>m$qrcZ~x)y0J0j zQIo0tcH$ayv6&7}|EvF@`f0@v4JrG+cj=dppp_I>89Jv0c+fS16A)Ep21 z_Xx-0XojJcCQo&$S5kFvc!Y!=g|$X>Be`+-OX8{&t`#EQVvUIMWu4fFzOdgIqOK&L zuQPyqszK}T8BLsHJdNwUQ=#hvVbRWs2*U$tXkPVS=ejXE-mkIxwVCw^Ne%2Lge}** z4&35XdqL`J==VMP5yn-DQS$AtJ1=l|@ z)t+;Q7EW~=5mE#KKT6wviL6hxqEEX|1;y{in?7lNX9W7E_bikx)ia8@9J z6O~{Aa_`tVit9kI|MQzQ{l=80B#q!{3vAoYNBbU~Hc&s9+qjInd;5DfTcev=gJW{e zBHQ?061~hJ7U8MGtPRk5(smjNtJ@&=P6Xd1BM#TcEztP8LUiV1N0ctTIv_~4_lV2D zMc)<(>6M(+sV%UFBDY>P)gCd_VblCm{dUh*FV0AftRNF-X!=v5z{%G^G%xj%pXViX?H7?_3rQKXv}BcMdM0x8f!|rH z>Y`8%oMcu(wXrWv_iwoCk6pnPe2C7SVG1UNw)x;}>0k!^H0TXoh$Fq?JnmPV%LPU- zYsamu#hsd}w%r_Gy-=5>mVHOb-{wyc1_s$ef{%1Wi}C@QfIWYX#`nOz=E?iHlRfZ= zGY$E+5S737b!m4j%9wbZ&B230{LQa->GK7J6{Hq`+E!dYg=RL?$IT2B(RwHEH`e=x zq)I7|AerC=dHzZlMGk*bB%-XT%e_l0B}jNDqTb%VgPD(gPQT4+Y#mrQ1tR)f-3GyD z`Bdhv4kN7H8`clr{DFcnFSqA!Eh=_a#$rJYs&(5^))`1ny-ja?ZgHfg#@orDUlk@B zdsT@BK2Etb@4k*7evem&o};KCythAz)}xq%5nqH?Wm&%XR>)$muodik0I}UuaF{SNDWZ_! zqgNqk9N@v?FGo?S{p<&R))OYdu?RK-uOUYwA6Kq1AV`b5Ugdx)lu~TCOld|}wfw~J zQqR>%HqVW)_Wm>9vx)#`+=N!PR`h(tj!$sg^Z54gC3N5mX`gDcd{fq! zx#JW&dM$17%!Z2g!zVO-#xTEqCV9M+4E{H15U9ToUv~gF)rBu;GqAKO&Wd_Es{fmyFe03oUB zDG9oY)HCigZS^}giWt3!g(MkX>SDxBgDDDpPtNYp<|y-+5Sc(U>oo1}tKRLY^Y#F5 zQ3|J5*})74?zAUKMo@Jni5Aw?hj|Z6KUf!u-e24*dU#no;b?%hgJD=CSOJT{NCraQ z47miZu{E(@ia-@PkT$-Lm?RKEy&*jq1ORR+^HyZhk?MZ$e&Nj(j&O5w8Ecm#A={b? zpB9f~BvVlTL@$Giah>eah%5-c;F_q_QDr>Zff<=#vWGs&W)Exue{hXwI{^q2+?mdc zE@!PV2*@vF%;zkxuxE=VFX{vwjM}r+E4R_!PCdHSAogog5(k#1nN1zQs9Z35%iCs3 z*O09RmC%Y2m`t#eLf4cqjAK$N?)mC<0`Z$Pu3@I~Ife+@6S4;!t1!~c4c_E1V3=x$ zk;ClH&FmmbminoJAeYuLPzP=%=oi~g`asDBd9pjt=P!dOm+}|$nUn^<$`t&lxO4;qa@SR zfw`*+Azl%{D%ZLB`{z`K)$R9qq+%;3=A-T!;CHYLKiOdTcJs6yOP zrP@wNx|JJ={ffrY9>r4>D8CVwjb{Cvas*dk%pIs6xqU&fQvX8z04FrBZzL3$m}+KX z6jF$Z8hg3g@^@A)7HPk3LeAA<_>bGdbJK2MowpG=%#b2aN{Yi+_u0yK!v{%}54$6` zQm3ez7@_*i)b{e#fZUrA<747qu>0>#AcuibMyehv57aS)dg2vW1%8V@ywP?NX^lcH zFKltM>UIUMA^p$9m2Ag{G=P$c*f9`yAf%L1`k_^ky%~L>PidSzu>y1g^dDFh8;*u> zHH6MxVZjhL6IUxtK`XO--28xxjUjQ*`e+8S8;eL#)_3#*5C2eas4*s>xAu%6!tIA= z?mHxYU&opJ5^Ql%%1&n_;B(jr0`4^mipe_X6s3{@x~~@pb3`%ln%9u6$=tYb2o(7; z$bgE+!FyY5F+vVl=7{C^_>R^xFd(?n1I*dK(v5_N+i4*gqYTo~;ec4L=0+h3`(Z(C z^{AA^9Zy}d_$6=4D^WoE90A2ZzSa>2xIu!P;xU;+NU`$58~5M0bxSVWx(Q^NjC6l9 zc7v0&FwPUF)n5Ls9lgyVV)br`nzsj7&=3cDrNDdfgTN1`@@drMd9#)o++%eW37W{scM2N(Q_?P^kC_z~?cy>8At{M*TJqcLksfWG)*i zl-AXZ1x?Xb`jAoBhrj=|IOO#A3uimn5UnMtP4Di`brX|vY!5!dMZqM}vktK^%YKuiMSoI8|lJQYl>{AY`6q(H6ORgzjRLV!u*ipsvOJ1x8OnS3*A<=^m4 z`I@I!=2QI*zk+qT1t+}wFYbwoM`?cKo)t4BPM1_kc_D)=wUx`1 z5A+9%hmdA94Z!t?sz=F{mK4|H#Z!E`fYL>JC*kTuqF{tk92O_29Dv-FS__xVtWt|K zG}bDGjfDeP2sw~ZsMY5r)`L^C&31j25E4dA(}#eaAfF3wjrn`v`bg<96AeiEy=m1R zS(rVFf2Bx+so7W9$De~PmuZjRIKdrU4uJ+1;HK*Jg-M7Fw~#n%1VKPSXz%ZMBPKG* zrfZkSv>b`|)0iD=0~Fty%__)L9ikAbHoB~JVT&^Z;!~KRtx!SfR62`tjPYZL>+_)Q zK*<&HHm`5X_J4Vg2RBUju?%ghWBKV6g1s48#O(*OyXf_^E;kXn=+GmHyUm7rowot3 zYA@(LB;CElUOs7709?ecvy|3~ccL6E#5u8$kLX&+ua zZvRW;6E{pj9=G=XTI9~v2_Aez#(46K?A1>Q@N!E(N_DOjhz~mqe(pQTs3R~?^I>x* zIsxRm-Y^oSRmi=}S?2W{;=JFBE3=`F%T>UiA!GVD0&11rNU>EF6h_L@LnkIQjW9m` z@q}YQ72f+!XSTOC{P3P&X@rphG(7ne9#sug_NGvD*5xTj%OX@k*eAl4vt7kc)6AGH zkf7+A;>ikrRC;e7r4MXH(m5dhB$iUBxVri)r>UUi(;_;koe}5ZrqOR+AJ$QpLw?@u zBPsMDK~c`>C_G^Ta_;o?DnR~34t#vSxA*5Zy_wQO!!xzcbDZt?OVwHCq{Bl{^xt*h zxUJ-U=!y=Twd<(1L4?lnhX8L#T;!{@!1G49P^D)#jBIQ!!8mb&h-JMSlJH;EJtMig zBzsoYo`&S<9mDF9c0w#|BujOc%AXIE-?rOLz0lDJ02rME1uBD?4OA=RIV}E)c&u$v zmRtoqrKh;WHc@haI%-0wyvlnLtLG5o~37W7YS5f*^xEKl*bPr;o-**Xr` zPJIdIp27vu{Ikjfb7T4u;1@FHSIfIbCszI|4YGr)tL1!4EJI=8cNRAj;V5W^K?x08 z%+-1lOJ%Xiw_9~HL-9Gdc*M2@NT3x+r>)XW;FHH{<_VXn-g( zA=*}#i|nj0R6W_ABN(H+fth?sipJ(I=C#zMMYc?ZqdIWj71bliTVvw;I83M(oytID zZCPUkTbn9{>Nz1m!Y0T|Uwl{1V3?l2gx8EOP?9X+gRh))fJ8wdx3c zNW)R(!`J~nDK3Z-)+ZKt$~gWUvANJLEv$9Z=5O$J^?DpyD49lZ4n*N~MYr^dg@$!``QfJ6fyV!O%Agy?;^VF*3X(gA|KIb%H>a z+lX@Q_ERgpsTd``y>FEse3@&2ycXM`Bl-4_z1QwGZ#eriuV~}ZccAz?Y~}%!CAYF1 z>nMhAt%Ch7S`pAtcDxFn*8Fxgq@vwz!)E}jyrOR@S@8nmR8b+1o8u%d-bH`Dk#S`SJ6DCz5CoKv7*Ef*}IG}wT|%5c_32`;>p zyjUMhc6W56tIUWN+#CzwwnipWA3OZbkX31_N58`@RL8m_d;)ckn@52jHM}w%snJsa zMtpXGFqnFV=9D}V3%v`C2ec@*p8K37CQu*YG3-V-kbh8R1%?X=__ucV5=`)t~5-v&%&eiq;WcO$UaV2?(F<{?_@=Z_f&1cDsoXbfKs8ySKQd>jB=)bQpQ*&g*c7kaz`e)%ignY%Oi zD0R-KC7BwIgYvu;Z^7=*wimvyv{A49r*TKiFY3X&ui2?EAAB?RJY!CTeKnv({0?fs1DCe!)K}j>2oDCLbiyp7YTKSoxb`G zRemZxOsk>NU!yga4{X(ew-Q6xJYRSqRHkVEB2iO028~Iui7_CKp|&nkJ7>Sf4k2D2 z0O*)IAJiyR7<6nU+BLSYpUPll#n#bd=IT%y7nNPqxv_D^=#utBPdxbUwOnff9FM2eX)2j+ z0Z^pyq@)lH$6A|Qg|*nL=U6pgTpJr>G7X$UpRFN~)W8OSxA!>0bd{!+&Z0{0u_xNb zkQhoCaY#xWYL9w*x)TU(?YGk7DtY2pj%OeOLE;%6NMO$=N&G;A=*2Pcn%J-E<^YeT zS#llZucNhC4Bua($-q+N1aH+5$aLvA0S3`D3lP!~)Xm(XmhIyW=%-OGsQC~7@@Zzs z^v03zRi3}bICV$h0GG*~q^Qo6X!*r&4e6&N@%D~u%CPnp0h9lL_$D(NDz+z>%w@K& z&7f(qIIv$EX1R``<2HfD6aw6a?=F>eY>7pK`7ub(!)YcnF0M)8ZbBxtplqweVPaf- z^|oL@AodZ3x#{YRU4>Xu|z{VpUt&_%CE-l=9Rv60D!~Y(nH&L87`CQa(GDqHn zLf*3&Ja2(Zh)W~>D8faP1f~b*%os)tHaK>o`V!-bwS=emz8YhDe+*z^PE}`&4R&h# zq7GpK;(?HZUGJ6I!5A@Vt?oD#IgUYtow2QVK-nv>I})8)Y%QuE6uvj7#E(*+62=)5uKQ_fQT(K|1W3s^Ms<+Uim)6o7|3SP!onxkq+6;oUSJF=#Z43$a zmSNqHf!BbQYP;Y6qQIUa^z%ZNK;I89Jz}oyR1(V|}#S?ie zwZTp$mIt}kJUwm5ls(2wn@VXF=C|xVvz|^R(JUECOof zN|!+-98sA5cz=qsk&55i;?i1r!Ctia5pl|Y0e0Tw@0G)rK*Z_({xBI^zCZZQZ3mj~ zp6`lZq>NIVs&e3=ms%*Pe2At(wxw75$IUp)+VqF2O3p=he64|Hr`V_Edo$AqE>}Gc z44bHKe)?!J<&6;AxPmQ>UK(~?rw^g>rX>qd;rFoTb|BLUI&VNLzsI{v$iY6+pDv&ILPKXLxW5 z<@F=804xFX1YGV0l+iwAFndH%fBT7!Ytr@!LVyEu71A)aIuOAZ==f2~Hf>cwNCq@r zTP#%xtl1{-eft^1P+?@H@dN=nmTh;T2&g;L45?im<13S!7X!V)#9G89zhL~k-^-0^ z>5H5;VpCw;Do7%5DWzBu(L1|agV%WL& zM|Ew~3BEp}DF2^UuVLcT^!tpnfb0XsF2rK~c>#r?Q@-VyxfE#6_jU`kuC`i)Yc#xEf72x{2Y zK5HbL$bN%YXLD_!yVLf=A8z<)?$1Xbj~+|2+N9C^9`;98Xe~d207ZQoARC-$!ri#_ zIIhQ+l7$WAAVwa0k1 zKl7`7F3=WHAqfNk*fB=S2kw*aaNM&xUB2xp52rgMnquy!GyYXpdZ8FyMb456LFiqF9|9Gqceg0d}3wImZAJxZ~R=G@VV72T_ ze)NGn;)u=%*}$>7J`W>6r{o?x&G$vX_A=d}V+ z0`!LBZ={0e6u&FXhN(tK;O?!}&;cg-!IJpXDpBRBzBZ5Y^Knuq{coZutQK8bQcx$R zsi7I0ogSZ(I4r3{M#iW&bRhx^hl9C$OqnOV$a!IXZ!vt0x5a-P>HlZNL^)ME4kiD3 zb;0SYieMO&;=hjNMu3C4xscM#{h$c)LXJb`B-y~ZA+m+IPV;G2I4w9y!^9i2m$5!^ z6Y@hN!AYYUALPQJX2Imj?e#7yxKzhI7hTgJ3)vbWkdJPmFENcf1k_gS&Cxv7U6Anr zS)dg`K=at@6qFG0t`({l1ZA?$4`)~r%!#4$br~gF|Zm*mXL=EbC%2%Tehupl!Fh$Dg=t&)K zB549Ga#X?G@WtHea^25n^(kfa)r1n@U4j(bNsr8=_$|vD8+pY>ZDdO64RAHty?1T4 zvD=tESDnd{M*G7_Vv{9nmsTJ1)iYSG$(mk}WT-S2U+y@Nn4eSA8mQTp4Z&I@74qec1R`Kp0@!mJ?lOo}0XVz*cXuxxv)#gR zc~Cn(WEU#MZIFOWr)Lkz9;uJG6F$b|0luyNu#)wGo6T}|v-l_9Qq9VYq)il*kxN>zOl52=;mX?Y~O}HP48w&oq z2k~Frnuddgl_)vqUvD-3-eXi*mBucw{+14L!V;W{+L=>$+e1Q{gp>)e+v{dHO`#%e_62eCAUE^!u6h3Jx^^JJCe? zF8A001fF@`W*V9Jd((Cv+nFOP)62Y7mOw=}9Krg4`|>*qJE)%gXVBBaa8mMAqm*f^ zs~75OIO?xFj?(H_>D^#ELG)hm|Ay~kJ#C(i&adWuzC;h`HwqnQ2Nus}NAZJq+-Enx zi*mzus)lZ7t<{D-Qegd7Ma^%OV)Vgf(tW@|Mfc6a+88@_#Z9DaBrLvGhr^_7w)1|4TvJ`J4O)r6GBk7^u4eVo^8xWKyL+L$q^At!(hrNy18t^ey zohd&xQ1;{kCi2q$05AWdJB&1iQg6p}7-MaUM`VK_J&?32o@g@uD$OZb1agXtYq*Hn zpD()zUDKs9Nyj!UMcbXu;<;vwa3XXcxCV&c zz_-Y?BlTGJWTLUU0RwOgYNtj+2HMZC_z7VrmvdNveLY!~XhDGd$XJV4bw$}>fbJgn zO(f4_6mz2ZsXHQymfG`Dkz!+uKk~-ILENtZc7W#|91qZyhk6g52LcC3ErZ_d?cpC0 zY!;+uDFPaOaI@?i&-+Wn>3sEiTKpeS;zzDoqbS?9@_8=V2`f3T%%~e+nT-VX$EBgv zxoB&Ek3PuKlTdTj+P6S~Q%gH^Jlb67NM;{d@{&=b+AzVi-$IQzt$p>#?dF^vJhQys zwjpM7Mrv(Zp75-}dK;v9mB&-P6PKRH#!>v)UQtgd zINSZXfrYxK>^QvM;+iQH!`lx?UE5Ptq^wm&(02i=QL8R3JnJU#rxL{9YYaubnIlNL z^}u9FH+8UQt3y^K+JDlWgs+d-QqRHIO;gWUQ|rshY(7Z!l%Yz+1s(xi&U9w(O7|WbGCi%7czbqVh}i`gX?5@aYtkx`n*uxU2CSkN;rAjQY4 zCw>fzaX(c19ML(mCg_QEA>ZBy+82H+{b2?Pf{6$Ani=jw>g3<83x0-!PGf$#u%oPhCwO^?Vua9GkEkL860WibTm zVguYk@Bx5GB7i6q49NQeB9Q_>dEEivrepzm&W5oB09FlvNeKvN1E4I1tp$M0XqLo+ zcbtw$B@0+!>O}%YkcY3{NhcGmI;&f@3E(IwW6`6T8;u8FWCytC7?CdAN(Ek_)U~m# zcFoc6@{>fE)5HMzCELnGva8*YkR?GUOu|9o2O4gmhacel*`}G00VjppVxatzkqU$O zm`oC-jJ(@)nbsPNn4u1l*o4q&S6+@UuOs-N6iH~hv24!m>u6e%4M-TIfWwLE53bsv zNh6+;Y$VM{EB}7d6@>RJ*=&zXOuQay^)HJogn)w?xKZ730KYS60(52Bo=1~JZOWy< zw8h=$7*o%ZcJscRZ50`UZ6&z73x%l^K35`;lkXsGmcLF zh08f>!EzsS=Jk4ivyu$)*d$#Oq)`kep-g&w$81;r)a_ySu~B z*W2@bcPP*Q3q-_T>xdDvwYb9tPrs2*;opw149*g-vELMauRMS$j#-4`>mH2fp!jw8=VmVC^=vvHl zu2Q~oab%V-okA@I$ntoxNW1egbF=dUxS07AMY@XVLV5eV1FHt2LJ>Ph=gMCZ{MRYFdP7J0W$$*x-Q`mR51w^ zb?+wAlDp;<+z^G_G7a5SmECp~zRsOijX}7_+p911nqc)Y7(v`I$;<>YIDH+;HDyF; z+e)z?SmD$LV-{$7%dXl z69$735Q3o)Cc2VkME5i6%KPcJgzUe2hTWu6Q;&7aQ2!2NmwIXjH?DYk%-@J?>-jUp zh#y7@z5A3fy1o5X;s&}lsC~-j)6>@MZT4_K{r&jYAI|By+tcWD(wy--a>9mY2a~9C z^sL#-X*YGX&%t{Y_F4)bNr@UYiZEmnQD&M^=mHYziW2M+)Bo3`%I)))|L+mdJ;zqv z=Ptva_df<4Sn?%}??&wpUj!%tB&tLIjx9YTnT~P&ceG0yjKMdrzxAbYjqi>9X`iDs z0ER~Pp1>W1fd~ZB(=3u09v|Tl^s@1V2mbFZGX!jz!>!Q97sRCn>jdB zDE!#*6b8`|AUDsqo^oDP24NT=Lqu)zYy`Lm$p}{Qklr_ zwTz^qn0gVs$rL^U`JAK?!-tfl(58G1GHdLHrxcf%p%@_)Wa5VULCG913CMmIl%rQbCff$ z5I`HdlHv8BQj1n!am55$O3Q~KnRo-D3he<4Td6A{!NO1yZwL58D5TWX(tM?3mu(v$ zWomWz)X5&HC8~7oyl91N3WL!*sosW?>oO;^(oqM7P+uDK#O4d!rBo=T$|NHvD~%f! zC({}4NyF94+&nvOri;I6SM3&yDKWMvhTgT!4gif-%lV6exs9?t4DT$kg{*;=LW@

    xzXw17 z0007do4J})yRF@xpUSuI>X*XbX8x7e+urD&U#)GtcM=!Efe@y6=<=reZ772OMXdi2 z>_0^N58-|?a;$ItKY1Lr+-BNu>iLz_|Ae0c{olT%Qd*Z8?ORihl_AH)3tyoU9u+}O z-#vs9jcdp%;7drSMcH#E$JI65HljeOq3Ah4E9u6pasn$ zOquM8pEYV=gV<;+2Q$2tf&O^hclJXkGPjeFpC04-+MAEz(c@;IRnwS!>=?nmn`9Hq zcSXvuTs0xAN`i(B*SQ{re@4BGEIX`9N?lEF3>~6sze;Cn;^_N zE)`ftI*LAwbe?XQV75VFV7kTxdPN?Lg0Q9Xq!RS3v2-Ixh&o0<4uL#^?E*D3a|8#R zokg9Y3MU?dN>C#n5?t0>ZDe4oA;sF-1y+~b9-IQEG9s>Zt0h}R#V@Mc}Z7HB@`s@Zu_N3>3o8>@xTf{this.props.children} - ); - } -} diff --git a/misc/config_tools/configurator/src/components/Banner/index.jsx b/misc/config_tools/configurator/src/components/Banner/index.jsx deleted file mode 100644 index c698d227a..000000000 --- a/misc/config_tools/configurator/src/components/Banner/index.jsx +++ /dev/null @@ -1,5 +0,0 @@ -import './Banner.css' -import {Banner} from "./Banner"; - - -export default Banner; \ No newline at end of file diff --git a/misc/config_tools/configurator/src/components/Confirm/Confirm.jsx b/misc/config_tools/configurator/src/components/Confirm/Confirm.jsx deleted file mode 100644 index 35af8d11e..000000000 --- a/misc/config_tools/configurator/src/components/Confirm/Confirm.jsx +++ /dev/null @@ -1,45 +0,0 @@ -import {Button, Modal} from "react-bootstrap"; -import {useState} from "react"; - -export default function Confirm(props) { - const [show, setShow] = useState(false); - - const handleClose = (choice) => { - setShow(false); - props.callback(choice) - } - - const handleShow = (e) => { - setShow(true); - e.preventDefault() - } - - return ( - handleClose('cancel')} size="lg"> - - {props.title} - - -

    - {props.content} -
    - - - - - - - - ); -} - diff --git a/misc/config_tools/configurator/src/components/Confirm/index.jsx b/misc/config_tools/configurator/src/components/Confirm/index.jsx deleted file mode 100644 index 8b5ecbaee..000000000 --- a/misc/config_tools/configurator/src/components/Confirm/index.jsx +++ /dev/null @@ -1,3 +0,0 @@ -import Confirm from "./Confirm"; - -export default Confirm \ No newline at end of file diff --git a/misc/config_tools/configurator/src/components/Footer/footer.jsx b/misc/config_tools/configurator/src/components/Footer/footer.jsx deleted file mode 100644 index 0f6bac9bb..000000000 --- a/misc/config_tools/configurator/src/components/Footer/footer.jsx +++ /dev/null @@ -1,25 +0,0 @@ -import {Component} from "react"; -import {getVersion} from "@tauri-apps/api/app"; - - -export default class Footer extends Component { - constructor(props) { - super(props); - this.state = { - version: "0.1.0" - } - } - - componentDidMount = () => { - getVersion().then((version) => { - this.setState({version: version}) - }) - } - - render = () => { - return
    -

    © Copyright Project ACRN™, a Series of LF Projects, LLC. - - Version {this.state.version}

    -
    - } -} \ No newline at end of file diff --git a/misc/config_tools/configurator/src/components/Footer/index.jsx b/misc/config_tools/configurator/src/components/Footer/index.jsx deleted file mode 100644 index c6c8f167f..000000000 --- a/misc/config_tools/configurator/src/components/Footer/index.jsx +++ /dev/null @@ -1,3 +0,0 @@ -import Footer from "./footer"; - -export default Footer \ No newline at end of file diff --git a/misc/config_tools/configurator/src/components/HelloWorld.vue b/misc/config_tools/configurator/src/components/HelloWorld.vue new file mode 100644 index 000000000..dbe43f7db --- /dev/null +++ b/misc/config_tools/configurator/src/components/HelloWorld.vue @@ -0,0 +1,21 @@ + + + + + diff --git a/misc/config_tools/configurator/src/components/Navbar/Navbar.css b/misc/config_tools/configurator/src/components/Navbar/Navbar.css deleted file mode 100644 index 8936059ac..000000000 --- a/misc/config_tools/configurator/src/components/Navbar/Navbar.css +++ /dev/null @@ -1,44 +0,0 @@ -body { - -webkit-app-region: no-drag -} - -.bg-navbar { - height: 80px; - background: #007B81; - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.15); - -webkit-user-select: none; - -webkit-app-region: drag; -} - -.logo-text { - cursor: default; - font-family: Roboto, serif; - font-style: normal; - font-weight: bold; - font-size: 26px; - line-height: 30px; - letter-spacing: 0.04em; - text-transform: uppercase; - - color: #9ADFD1; -} - -.controlButtons { - margin-right: 30px; - width: 130px; - filter: drop-shadow(3px 3px 2px rgb(0 0 0 / 0.4)); -} - - -.wmb { - cursor: pointer; - -webkit-app-region: no-drag; -} - -.wmb:hover { - opacity: 0.7; -} - -.btn-close { - -webkit-app-region: no-drag; -} \ No newline at end of file diff --git a/misc/config_tools/configurator/src/components/Navbar/Navbar.jsx b/misc/config_tools/configurator/src/components/Navbar/Navbar.jsx deleted file mode 100644 index 8e19300fd..000000000 --- a/misc/config_tools/configurator/src/components/Navbar/Navbar.jsx +++ /dev/null @@ -1,39 +0,0 @@ -import React from "react"; -import {Container} from "react-bootstrap"; -import {Navbar as BootstrapNavbar} from "react-bootstrap"; -import logo from "./images/ACRN_Logo.svg"; -import {faWindowMaximize} from "@fortawesome/free-regular-svg-icons"; -import {faClose, faMinus} from "@fortawesome/free-solid-svg-icons" -import {FontAwesomeIcon} from "@fortawesome/react-fontawesome"; - -import {windowHelper} from "../../lib/platform/tauri/tauri"; - - -export class Navbar extends React.Component { - render() { - return ( - - - - ACRN -
    - Configurator -
    -
    -
    - - - -
    -
    -
    - ); - } -} diff --git a/misc/config_tools/configurator/src/components/Navbar/index.jsx b/misc/config_tools/configurator/src/components/Navbar/index.jsx deleted file mode 100644 index 12075d91d..000000000 --- a/misc/config_tools/configurator/src/components/Navbar/index.jsx +++ /dev/null @@ -1,5 +0,0 @@ -import './Navbar.css' -import {Navbar} from "./Navbar"; - - -export default Navbar; \ No newline at end of file diff --git a/misc/config_tools/configurator/src/components/common/Banner.vue b/misc/config_tools/configurator/src/components/common/Banner.vue new file mode 100644 index 000000000..1d41e51f6 --- /dev/null +++ b/misc/config_tools/configurator/src/components/common/Banner.vue @@ -0,0 +1,21 @@ + + + + + \ No newline at end of file diff --git a/misc/config_tools/configurator/src/components/common/ControlBar.vue b/misc/config_tools/configurator/src/components/common/ControlBar.vue new file mode 100644 index 000000000..b9dd7293c --- /dev/null +++ b/misc/config_tools/configurator/src/components/common/ControlBar.vue @@ -0,0 +1,96 @@ + + + + + + \ No newline at end of file diff --git a/misc/config_tools/configurator/src/components/common/Footer.vue b/misc/config_tools/configurator/src/components/common/Footer.vue new file mode 100644 index 000000000..4f66411bc --- /dev/null +++ b/misc/config_tools/configurator/src/components/common/Footer.vue @@ -0,0 +1,39 @@ + + + + + \ No newline at end of file diff --git a/misc/config_tools/configurator/src/favicon.svg b/misc/config_tools/configurator/src/favicon.svg deleted file mode 100644 index de4aeddc1..000000000 --- a/misc/config_tools/configurator/src/favicon.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/misc/config_tools/configurator/src/index.scss b/misc/config_tools/configurator/src/index.scss deleted file mode 100644 index b24d45b1c..000000000 --- a/misc/config_tools/configurator/src/index.scss +++ /dev/null @@ -1,36 +0,0 @@ -// global -$primary: #007B81; - -// grid padding -$grid-gutter-width: 0; - -// a -$link-decoration: auto; -$link-shade-percentage: 39%; - -// text box fontsize -$input-font-size-lg: 1rem; - -@import "../node_modules/bootstrap/scss/bootstrap"; - -.text-pre-line { - white-space: pre-line; -} - -.btn.btn-outline-primary { - color: #007B81; - border-color: #007B81; - background-color: white; -} - -.btn-outline-primary:hover { - color: #004B50; - border-color: #004B50; - background-color: white; -} - -.btn-close-white { - opacity: 1; - filter: none; - background-image: url("data:image/svg+xml,%3Csvg width='18' height='18' viewBox='0 0 18 18' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11.5195 8.99331L17.4644 3.04835C18.1607 2.3521 18.1607 1.21845 17.4644 0.522192C16.7682 -0.174064 15.6345 -0.174064 14.9383 0.522192L8.99331 6.46715L3.04835 0.531118C2.3521 -0.165138 1.21845 -0.165138 0.522192 0.531118C-0.174064 1.22737 -0.174064 2.36102 0.522192 3.05728L6.46715 9.00223L0.522192 14.9472C-0.174064 15.6434 -0.174064 16.7771 0.522192 17.4733C0.87032 17.8215 1.32556 18 1.78081 18C2.23605 18 2.6913 17.8215 3.03942 17.4733L8.98438 11.5284L14.9293 17.4733C15.2775 17.8215 15.7327 18 16.1879 18C16.6432 18 17.0984 17.8215 17.4466 17.4733C18.1428 16.7771 18.1428 15.6434 17.4466 14.9472L11.5195 8.99331Z' fill='white'/%3E%3C/svg%3E%0A"); -} \ No newline at end of file diff --git a/misc/config_tools/configurator/src/lib/.gitignore b/misc/config_tools/configurator/src/lib/.gitignore deleted file mode 100644 index b2a7018ad..000000000 --- a/misc/config_tools/configurator/src/lib/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -pyodide -/pyodide.tar.bz2 diff --git a/misc/config_tools/configurator/src/lib/acrn.jsx b/misc/config_tools/configurator/src/lib/acrn.jsx deleted file mode 100644 index 39eea611e..000000000 --- a/misc/config_tools/configurator/src/lib/acrn.jsx +++ /dev/null @@ -1,503 +0,0 @@ -import _ from "lodash"; - -import React, {Component} from "react"; -import {path} from "@tauri-apps/api"; -import scenario from '../assets/schema/scenario.json' -import {createSearchParams} from "react-router-dom"; -import queryString from 'query-string' -import {invoke} from "@tauri-apps/api/tauri"; -import {getNewSchema} from "./runpy"; - - -function ThrowError(errMsg) { - alert(errMsg) - throw new Error(errMsg) -} - -function NameTrans(name) { - return { - "recentlyWorkingFolders": "WorkingFolder", - "board": "Board", - "scenario": "Scenario", - }[name.replace("History", "")] -} - -class EventBase extends Component { - constructor(props) { - super(props) - this.funRegister = {} - this.funRegisterID = 0 - this.eventName = { - scenarioDataUpdate: 'scenarioDataUpdate' - } - } - - register = (eventName, fun) => { - if (this.funRegister.hasOwnProperty(eventName)) { - this.funRegisterID++ - this.funRegister[eventName][this.funRegisterID] = fun - return this.funRegisterID - } - } - - unregister = (eventName, funRegisterID) => { - if (this.funRegister.hasOwnProperty(eventName)) { - if (this.funRegister[eventName].hasOwnProperty(funRegisterID)) { - delete this.funRegister[eventName][funRegisterID] - } - } - } - -} - - -export class XMLLayer extends EventBase { - constructor(helper) { - super(); - this.helper = helper - this.funRegister = { - onScenarioLoad: [] - } - } - - #parseXML = (XMLText) => { - return (new DOMParser()).parseFromString(XMLText, "text/xml") - } - - #validateBoardXMLText = boardXMLText => { - // call inside - try { - let boardXML = this.#parseXML(boardXMLText, "text/xml"); - return !!boardXML.querySelector("BIOS_INFO") - } catch (e) { - return false - } - } - - #validateScenarioXMLText = (scenarioXMLText) => { - // call inside - try { - let scenarioXML = this.#parseXML(scenarioXMLText); - return !!scenarioXML.querySelector("acrn-config") - } catch (e) { - return false - } - } - - loadBoard = async (boardXMLPath) => { - // call by program - let boardXMLText = await this.helper.read(await this.helper.resolveHome(boardXMLPath)) - if (this.#validateBoardXMLText(boardXMLText)) { - let PCIDevices = this.getPCIDevice(boardXMLText) - return {boardXMLText, PCIDevices} - } else { - alert('Board XML Error!') - return false - } - } - - loadScenario = async (scenarioXMLPath) => { - // call by program - // load scenario data from xml file - let scenarioXMLText = await this.helper.read(await this.helper.resolveHome(scenarioXMLPath)) - if (!this.#validateScenarioXMLText(scenarioXMLText)) { - ThrowError('Scenario XML Error!') - } - - return this.helper.convertXMLTextToObj(scenarioXMLText)['acrn-config'] - } - - getPCIDevice = (boardXMLText) => { - let pci_devices = this.#parseXML(boardXMLText).querySelector("PCI_DEVICE").textContent - // Remove Region line - pci_devices = pci_devices.replace(/Region.+\s+/g, '\n') - // Remove Space - pci_devices = pci_devices.replace(/[\n\t]+/g, '\n') - // Split by \n - pci_devices = pci_devices.split('\n') - - return _.uniq(pci_devices) - } - - saveBoard = (boardFileWritePath, boardData) => { - this.helper.save(boardFileWritePath, boardData) - } - - saveScenario = (scenarioWritePath, scenarioData) => { - // call by program - console.log(scenarioData) - const scenarioXML = this.helper.convertObjToXML({'acrn-config': scenarioData}) - console.log(scenarioXML) - // debugger - this.helper.save(scenarioWritePath, scenarioXML) - } -} - - -export class ProgramLayer extends EventBase { - constructor(helper, instanceOfXMLLayer) { - super() - this.helper = helper - this.vmID = 0 - this.scenarioData = {} - this.initScenario() - this.xmlLayer = instanceOfXMLLayer - this.funRegister = { - scenarioDataUpdate: [] - } - } - - initScenario = () => { - this.vmID = 0 - this.scenarioData = { - hv: {}, - vm: { - PRE_LAUNCHED_VM: [], - SERVICE_VM: [], - POST_LAUNCHED_VM: [], - } - } - } - - onScenarioDataUpdateEvent() { - this.funRegister.scenarioDataUpdate.map((f) => f()) - } - - newScenario = (preLaunchedVM, serviceVM, postLaunchedVM) => { - // call by view - this.initScenario() - for (let i = 0; i < preLaunchedVM; i++) { - this.addVM('PRE_LAUNCHED_VM') - } - for (let i = 0; i < serviceVM; i++) { - this.addVM('SERVICE_VM') - } - for (let i = 0; i < postLaunchedVM; i++) { - this.addVM('POST_LAUNCHED_VM') - } - this.onScenarioDataUpdateEvent() - } - - - addVM = (VMType, vmData = {}) => { - // call by inside and view - // if provide VMType and vmData at same time - // function will set VMType to vmData - let vm = vmData - let usedVMID = false; - - // check VMType - let vmType = VMType; - if (!_.isString(vmType) || _.isEmpty(vmType)) { - // vmType is empty or not correct - if (vm.hasOwnProperty('load_order')) { - vmType = vm.load_order; - } else { - ThrowError('No VMType Set') - } - } else { - if (vm.hasOwnProperty('load_order') && vm.load_order !== vmType) { - console.warn("vmType and vmData provide load_order at same time, set vmData's load_order to vmType now") - } - vm.load_order = vmType - } - - - // check and validate vm name - if (!vm.hasOwnProperty('name') || !_.isString(vm.name) || _.isEmpty(vm.name)) { - vm.name = 'VM' + this.vmID - usedVMID = true - } - - vm['@id'] = this.vmID - this.vmID++ - - // add to config - this.scenarioData.vm[vmType].push(vm) - this.onScenarioDataUpdateEvent() - } - - isServiceVM = (vmID) => { - for (var idx in this.scenarioData.vm.SERVICE_VM) { - if (this.scenarioData.vm.SERVICE_VM[idx]['@id'] === vmID) { - return true - } - } - return false - } - - deleteVM = (vmID) => { - // call by view - for (let vmType in this.scenarioData.vm) { - this.scenarioData.vm[vmType].map((vmConfig, vmIndex) => { - if (vmConfig['@id'] === vmID) { - this.scenarioData.vm[vmType].splice(vmIndex, 1) - } - }) - } - this.onScenarioDataUpdateEvent() - } - - loadBoard = async (WorkingFolder, boardXMLPath) => { - // call by view - let boardData = await this.xmlLayer.loadBoard(boardXMLPath) - if (boardData === false) { - return false - } - let {boardXMLText, PCIDevices} = boardData - - // get new board file name - let newBoardFileName = await path.basename(boardXMLPath) - let cut = 0 - if (_.endsWith(newBoardFileName.toLowerCase(), '.xml')) { - cut = '.xml'.length - } - if (_.endsWith(newBoardFileName.toLowerCase(), '.board.xml')) { - cut = '.board.xml'.length - } - newBoardFileName = newBoardFileName.slice(0, newBoardFileName.length - cut) - newBoardFileName = newBoardFileName + '.board.xml' - - // new board file save path - const boardFileWritePath = await path.join(await this.helper.resolveHome(WorkingFolder), newBoardFileName) - - // remove current working folder old Board File first - await this.removeOldBoardFile(WorkingFolder) - - // save board file to working director - this.xmlLayer.saveBoard(boardFileWritePath, boardXMLText) - // get shownName - let shownName = await path.join(WorkingFolder, newBoardFileName) - console.log({shownName, boardXMLText, PCIDevices}) - return {shownName, boardXMLText, PCIDevices} - } - - loadScenario = async (scenarioXMLPath) => { - // call by view - let scenarioConfig = await this.xmlLayer.loadScenario(scenarioXMLPath) - this.initScenario() - this.scenarioData.hv = scenarioConfig.hv; - if (scenarioConfig.hasOwnProperty('vm')) { - if (!_.isArray(scenarioConfig.vm)) { - if (_.isObject(scenarioConfig.vm)) { - scenarioConfig.vm = [scenarioConfig.vm] - } else { - console.log(scenarioConfig.vm); - debugger; - this.onScenarioDataUpdateEvent() - return - } - } - scenarioConfig.vm.map((vmConfig, index) => { - let vmType = vmConfig.load_order - if (!this.scenarioData.vm.hasOwnProperty(vmType)) { - try { - ThrowError('VM @id=' + index + ' VMType Does Not Exist') - } catch (e) { - - } - } else { - //fix pci_devs is object issue - if ( - vmConfig.hasOwnProperty("pci_devs") && - vmConfig.pci_devs != null && - vmConfig.pci_devs.hasOwnProperty("pci_dev") && - vmConfig.pci_devs != null && - _.isString(vmConfig.pci_devs.pci_dev) - ) { - vmConfig.pci_devs.pci_dev = [vmConfig.pci_devs.pci_dev] - } - this.addVM(vmType, vmConfig) - } - }) - } - this.onScenarioDataUpdateEvent() - } - - getOriginScenarioData = () => { - // call by inside - let originScenario = _.cloneDeep(this.scenarioData) - originScenario.vm = originScenario.vm.PRE_LAUNCHED_VM.concat( - originScenario.vm.SERVICE_VM, - originScenario.vm.POST_LAUNCHED_VM - ) - return originScenario - } - - async removeOldBoardFile(WorkingFolder) { - let files = await this.helper.list(await this.helper.resolveHome(WorkingFolder)) - files.map((filename) => { - if (_.endsWith(filename, '.board.xml')) { - this.helper.remove(filename) - } - }) - } - - - saveScenario = async (WorkingFolder) => { - // call by view - let originScenarioData = this.getOriginScenarioData() - let filename = 'scenario.xml' - let scenarioWritePath = await path.join(await this.helper.resolveHome(WorkingFolder), filename) - this.xmlLayer.saveScenario(scenarioWritePath, originScenarioData) - // noinspection UnnecessaryLocalVariableJS - let shownPath = await path.join(WorkingFolder, filename) - return shownPath - } - -} - -export class Configurator extends EventBase { - // get data from Program - // convert it to view data - constructor(helper) { - super() - - this.WorkingFolder = this.#getURLParam('WorkingFolder') - - this.helper = helper - this.XMLLayer = new XMLLayer(this.helper) - this.programLayer = new ProgramLayer(this.helper, this.XMLLayer) - - this.vmSchemas = this.Schemas() - this.hvSchema = this.vmSchemas.HV - delete this.vmSchemas.HV - - this.updateSchema() - } - - #getURLParam(key) { - let hash = location.hash - let params = hash.substring(hash.indexOf('?')) - params = queryString.parse(params) - return params[key] - } - - #buildPageParams(url, queryParams = {}) { - let data = {pathname: url} - if (queryParams) { - data.search = createSearchParams(queryParams).toString() - } - return data; - } - - settingWorkingFolder = (WorkingFolder) => { - this.WorkingFolder = WorkingFolder - return this.#buildPageParams('./config', {WorkingFolder}) - } - - updateSchema = () => { - let listingFunctions = [this.ivshmemEnum] - listingFunctions.forEach((func) => { - func() - this.programLayer.register("scenarioDataUpdate", func) - }) - } - - ivshmemEnum = () => { - let odata = this.programLayer.getOriginScenarioData() - let vmNames = odata.vm.map((vmData) => { - return vmData.name - }) - if (vmNames.length === 0) { - vmNames = [''] - } - this.hvSchema.basic.definitions.VMNameType.enum = vmNames - } - - - loadBoard = async (boardXMLPath, callback) => { - let boardData = await this.programLayer.loadBoard(this.WorkingFolder, boardXMLPath) - if (boardData === false) { - await this.removeHistory('board', boardXMLPath) - return - } - let {shownName, boardXMLText, PCIDevices} = boardData - scenario.definitions.PCIDevsConfiguration.properties.pci_dev.items.enum = PCIDevices - Object.keys(this.vmSchemas).map((VMTypeKey) => { - Object.keys(this.vmSchemas[VMTypeKey]).map((configLevelKey) => { - this.vmSchemas[VMTypeKey][configLevelKey].definitions.PCIDevsConfiguration.properties.pci_dev.items.enum = PCIDevices - }) - }) - try { - let new_scenario = getNewSchema(boardXMLText) - scenario.definitions = new_scenario.definitions; - Object.keys(this.vmSchemas).map((VMTypeKey) => { - Object.keys(this.vmSchemas[VMTypeKey]).map((configLevelKey) => { - this.vmSchemas[VMTypeKey][configLevelKey].definitions = new_scenario.definitions - }) - }) - Object.keys(this.hvSchema).map((configLevelKey) => { - this.hvSchema[configLevelKey].definitions = new_scenario.definitions; - }) - } catch (e) { - - } - - callback(shownName, boardXMLText) - } - - async getHistory(key) { - let p = await invoke("get_history", {historyType: NameTrans(key)}) - console.log("p", p); - return JSON.parse(p) - } - - async addHistory(key, historyPath) { - await invoke("add_history", {historyType: NameTrans(key), path: historyPath}) - return Promise.resolve() - } - - async setHistory(key, history) { - return Promise.resolve() - } - - async removeHistory(key, historyPath) { - let history = await this.getHistory(key) - let index = history.indexOf(historyPath); - if (index > -1) { - history.splice(index, 1); - } - return this.setHistory(key, history) - } - - - saveScenario = async () => { - let shownPath = await this.programLayer.saveScenario(this.WorkingFolder) - return this.addHistory('scenario', shownPath) - } - - - static #getSchema(prefix) { - let bo = scenario.definitions[prefix + "BasicConfigType"] - let basic = _.cloneDeep(scenario); - basic.type = bo.type; - basic.required = bo.required; - basic.properties = bo.properties; - - let ao = scenario.definitions[prefix + "AdvancedConfigType"] - let advanced = _.cloneDeep(scenario); - advanced.type = ao.type; - advanced.required = ao.required; - advanced.properties = ao.properties; - - return {basic, advanced} - } - - Schemas() { - let prefixData = { - HV: 'HV', - PRE_LAUNCHED_VM: 'PreLaunchedVM', - SERVICE_VM: 'ServiceVM', - POST_LAUNCHED_VM: 'PostLaunchedVM' - } - for (let key in prefixData) { - prefixData[key] = Configurator.#getSchema(prefixData[key]) - } - return prefixData - } - - log() { - this.helper.log(...arguments) - } -} diff --git a/misc/config_tools/configurator/src/lib/acrn.ts b/misc/config_tools/configurator/src/lib/acrn.ts new file mode 100644 index 000000000..ace81c7c2 --- /dev/null +++ b/misc/config_tools/configurator/src/lib/acrn.ts @@ -0,0 +1,144 @@ +import {dialog, invoke} from "@tauri-apps/api"; +import JSON2XML from "./json2xml" +import scenarioSchema from "../assets/schema/scenario.json"; +import {OpenDialogOptions} from "@tauri-apps/api/dialog"; + +enum HistoryType { + WorkingFolder, + Board, + Scenario +} + +export type HistoryTypeString = keyof typeof HistoryType; + +class PythonObject { + api(scriptName, ...params) { + // @ts-ignore + let pythonFunction = window.pyodide.pyimport(`configurator.pyodide.${scriptName}`); + let result = pythonFunction.main(...params); + return JSON.parse(result); + } + + loadBoard(boardXMLText) { + return this.api('loadBoard', boardXMLText) + } + + loadScenario(scenarioXMLText) { + return this.api('loadScenario', scenarioXMLText) + } + + validateScenario(boardXMLText, scenarioXMLText) { + return this.api('validateScenario', boardXMLText, scenarioXMLText) + } + + generateLaunchScript(boardXMLText, scenarioXMLText) { + return this.api('generateLaunchScript', boardXMLText, scenarioXMLText) + } +} + +class Configurator { + public pythonObject: PythonObject; + + constructor() { + this.pythonObject = new PythonObject() + } + + getHistory(historyType: HistoryTypeString): Promise { + return invoke("get_history", {historyType}) + .then((historyJsonText) => { + if (typeof historyJsonText === "string") { + return JSON.parse(historyJsonText); + } + return []; + }) + } + + addHistory(historyType: HistoryTypeString, historyPath: String) { + return invoke("add_history", {historyType, historyPath}) + } + + openDialog(options: OpenDialogOptions) { + return dialog.open(options) + } + + readFile(filePath: String): Promise { + return invoke("acrn_read", {filePath}) + } + + writeFile(filePath: String, contents: String) { + return invoke("acrn_write", {filePath, contents}) + } + + isFile(filePath: String): Promise { + return invoke("acrn_is_file", {path: filePath}) + } + + readDir(path: String, recursive: Boolean) { + return invoke('acrn_read_dir', {path, recursive}) + } + + creatDir(path: String) { + return invoke('acrn_create_dir', {path}) + } + + runPython(code: String, isJSON = false): String | Object { + // @ts-ignore + let result = window.pydoide.runPython(code); + if (isJSON) { + result = JSON.parse(result) + } + return result + } + + loadBoard(path: String) { + return this.readFile(path) + .then((fileContent) => { + let params = JSON.stringify({ + boardXML: fileContent, + scenarioSchema: scenarioSchema + }) + return this.pythonObject.loadBoard(fileContent) + }) + + } + + loadScenario(path: String): Object { + return this.readFile(path).then((fileContent) => { + return this.pythonObject.loadScenario(fileContent) + }) + } + + newVM(vmid, load_order) { + return { + '@id': vmid, + load_order: load_order, + name: `VM${vmid}` + } + } + + createNewScenario(pre, service, post) { + let newScenario = { + hv: {}, + vm: [] + } + let vmid = 0 + let vmNums = {'PRE_LAUNCHED_VM': pre, 'SERVICE_VM': service, 'POST_LAUNCHED_VM': post} + for (let key in vmNums) { + for (let i = 0; i < vmNums[key]; i++) { + newScenario.vm.push(this.newVM(vmid, key)) + vmid++; + } + } + return newScenario; + } + + convertScenarioToXML(scenarioData: Object) { + let json2xml = new JSON2XML(); + let xml_data = json2xml.convert(scenarioData); + return xml_data + } + +} + +let configurator = new Configurator() +export default configurator \ No newline at end of file diff --git a/misc/config_tools/configurator/src/lib/bs4rjsf/.gitignore b/misc/config_tools/configurator/src/lib/bs4rjsf/.gitignore deleted file mode 100644 index 4e57eef88..000000000 --- a/misc/config_tools/configurator/src/lib/bs4rjsf/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -*.js -*.js.map diff --git a/misc/config_tools/configurator/src/lib/bs4rjsf/AddButton/AddButton.tsx b/misc/config_tools/configurator/src/lib/bs4rjsf/AddButton/AddButton.tsx deleted file mode 100644 index cc3ad1086..000000000 --- a/misc/config_tools/configurator/src/lib/bs4rjsf/AddButton/AddButton.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import React from "react"; - -import {AddButtonProps} from "@rjsf/core"; -import Button from "react-bootstrap/Button"; -import {BsPlus} from "react-icons/bs"; - -const AddButton: React.FC = props => ( - -); - -export default AddButton; diff --git a/misc/config_tools/configurator/src/lib/bs4rjsf/AddButton/index.ts b/misc/config_tools/configurator/src/lib/bs4rjsf/AddButton/index.ts deleted file mode 100644 index d8452a62d..000000000 --- a/misc/config_tools/configurator/src/lib/bs4rjsf/AddButton/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export {default} from "./AddButton"; -export * from "./AddButton"; diff --git a/misc/config_tools/configurator/src/lib/bs4rjsf/ArrayFieldTemplate/ArrayFieldTemplate.tsx b/misc/config_tools/configurator/src/lib/bs4rjsf/ArrayFieldTemplate/ArrayFieldTemplate.tsx deleted file mode 100644 index fbe9b2ed7..000000000 --- a/misc/config_tools/configurator/src/lib/bs4rjsf/ArrayFieldTemplate/ArrayFieldTemplate.tsx +++ /dev/null @@ -1,210 +0,0 @@ -import React from "react"; -import {utils} from "@rjsf/core"; -import Row from "react-bootstrap/Row"; -import Col from "react-bootstrap/Col"; -import Container from "react-bootstrap/Container"; -import {ArrayFieldTemplateProps, IdSchema} from "@rjsf/core"; - -import AddButton from "../AddButton/AddButton"; -import IconButton from "../IconButton/IconButton"; - -const {isMultiSelect, getDefaultRegistry} = utils; - -const ArrayFieldTemplate = (props: ArrayFieldTemplateProps) => { - const {schema, registry = getDefaultRegistry()} = props; - - if (isMultiSelect(schema, registry.rootSchema)) { - return ; - } else { - return ; - } -}; - -type ArrayFieldTitleProps = { - TitleField: any; - idSchema: IdSchema; - title: string; - required: boolean; -}; - -const ArrayFieldTitle = ({ - TitleField, - idSchema, - title, - required, - }: ArrayFieldTitleProps) => { - if (!title) { - return null; - } - - const id = `${idSchema.$id}__title`; - return ; -}; - -type ArrayFieldDescriptionProps = { - DescriptionField: any; - idSchema: IdSchema; - description: string; -}; - -const ArrayFieldDescription = ({ - DescriptionField, - idSchema, - description, - }: ArrayFieldDescriptionProps) => { - if (!description) { - return null; - } - - const id = `${idSchema.$id}__description`; - return ; -}; - -// Used in the two templates -const DefaultArrayItem = (props: any) => { - const btnStyle = { - flex: 1, - paddingLeft: 6, - paddingRight: 6, - fontWeight: "bold", - }; - return ( -
    - - {props.children} - - - {props.hasToolbar && ( -
    - {(props.hasMoveUp || props.hasMoveDown) && ( -
    - -
    - )} - - {(props.hasMoveUp || props.hasMoveDown) && ( -
    - -
    - )} - - {props.hasRemove && ( -
    - -
    - )} -
    - )} - -
    -
    - ); -}; - -const DefaultFixedArrayFieldTemplate = (props: ArrayFieldTemplateProps) => { - return ( -
    - - - {(props.uiSchema["ui:description"] || props.schema.description) && ( -
    - {props.uiSchema["ui:description"] || props.schema.description} -
    - )} - -
    - {props.items && props.items.map(DefaultArrayItem)} -
    - - {props.canAdd && ( - - )} -
    - ); -}; - -const DefaultNormalArrayFieldTemplate = (props: ArrayFieldTemplateProps) => { - return ( -
    - - - - - {(props.uiSchema["ui:description"] || props.schema.description) && ( - - )} - - - {props.items && props.items.map(p => DefaultArrayItem(p))} - - {props.canAdd && ( - - - - - - - - )} - - - -
    - ); -}; - -export default ArrayFieldTemplate; diff --git a/misc/config_tools/configurator/src/lib/bs4rjsf/ArrayFieldTemplate/index.ts b/misc/config_tools/configurator/src/lib/bs4rjsf/ArrayFieldTemplate/index.ts deleted file mode 100644 index a4dd3bbba..000000000 --- a/misc/config_tools/configurator/src/lib/bs4rjsf/ArrayFieldTemplate/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export {default} from "./ArrayFieldTemplate"; -export * from "./ArrayFieldTemplate"; diff --git a/misc/config_tools/configurator/src/lib/bs4rjsf/CheckboxWidget/CheckboxWidget.tsx b/misc/config_tools/configurator/src/lib/bs4rjsf/CheckboxWidget/CheckboxWidget.tsx deleted file mode 100644 index aa79b1664..000000000 --- a/misc/config_tools/configurator/src/lib/bs4rjsf/CheckboxWidget/CheckboxWidget.tsx +++ /dev/null @@ -1,50 +0,0 @@ -import React from "react"; - -import {WidgetProps} from "@rjsf/core"; -import Form from "react-bootstrap/Form"; - -const CheckboxWidget = (props: WidgetProps) => { - const { - id, - value, - required, - disabled, - readonly, - label, - schema, - autofocus, - onChange, - onBlur, - onFocus, - } = props; - - const _onChange = ({ - target: {checked}, - }: React.FocusEvent) => onChange(checked); - const _onBlur = ({ - target: {checked}, - }: React.FocusEvent) => onBlur(id, checked); - const _onFocus = ({ - target: {checked}, - }: React.FocusEvent) => onFocus(id, checked); - - const desc = label || schema.description; - return ( - - - - ); -}; - -export default CheckboxWidget; diff --git a/misc/config_tools/configurator/src/lib/bs4rjsf/CheckboxWidget/index.ts b/misc/config_tools/configurator/src/lib/bs4rjsf/CheckboxWidget/index.ts deleted file mode 100644 index 1090bf22c..000000000 --- a/misc/config_tools/configurator/src/lib/bs4rjsf/CheckboxWidget/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export {default} from "./CheckboxWidget"; -export * from "./CheckboxWidget"; diff --git a/misc/config_tools/configurator/src/lib/bs4rjsf/CheckboxesWidget/CheckboxesWidget.tsx b/misc/config_tools/configurator/src/lib/bs4rjsf/CheckboxesWidget/CheckboxesWidget.tsx deleted file mode 100644 index 2b34bf3f8..000000000 --- a/misc/config_tools/configurator/src/lib/bs4rjsf/CheckboxesWidget/CheckboxesWidget.tsx +++ /dev/null @@ -1,103 +0,0 @@ -import React from "react"; -import Form from "react-bootstrap/Form"; -import {WidgetProps} from "@rjsf/core"; - -const selectValue = (value: any, selected: any, all: any) => { - const at = all.indexOf(value); - const updated = selected.slice(0, at).concat(value, selected.slice(at)); - - // As inserting values at predefined index positions doesn't work with empty - // arrays, we need to reorder the updated selection to match the initial order - return updated.sort((a: any, b: any) => all.indexOf(a) > all.indexOf(b)); -}; - -const deselectValue = (value: any, selected: any) => { - return selected.filter((v: any) => v !== value); -}; - -const CheckboxesWidget = ({ - schema, - label, - id, - disabled, - options, - value, - autofocus, - readonly, - required, - onChange, - onBlur, - onFocus, - }: WidgetProps) => { - const {enumOptions, enumDisabled, inline} = options; - - const _onChange = (option: any) => ({ - target: {checked}, - }: React.ChangeEvent) => { - const all = (enumOptions as any).map(({value}: any) => value); - - if (checked) { - onChange(selectValue(option.value, value, all)); - } else { - onChange(deselectValue(option.value, value)); - } - }; - - const _onBlur = ({target: {value}}: React.FocusEvent) => - onBlur(id, value); - const _onFocus = ({ - target: {value}, - }: React.FocusEvent) => onFocus(id, value); - - return ( - <> - {label || schema.title} - - {(enumOptions as any).map((option: any, index: number) => { - const checked = value.indexOf(option.value) !== -1; - const itemDisabled = - enumDisabled && (enumDisabled as any).indexOf(option.value) != -1; - - return inline ? ( -
    - - - ) : ( -
    - - - ); - })} -
    - - ); -}; - -export default CheckboxesWidget; diff --git a/misc/config_tools/configurator/src/lib/bs4rjsf/CheckboxesWidget/index.ts b/misc/config_tools/configurator/src/lib/bs4rjsf/CheckboxesWidget/index.ts deleted file mode 100644 index 0a330f7ce..000000000 --- a/misc/config_tools/configurator/src/lib/bs4rjsf/CheckboxesWidget/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export {default} from "./CheckboxesWidget"; -export * from "./CheckboxesWidget"; diff --git a/misc/config_tools/configurator/src/lib/bs4rjsf/ColorWidget/ColorWidget.tsx b/misc/config_tools/configurator/src/lib/bs4rjsf/ColorWidget/ColorWidget.tsx deleted file mode 100644 index 3cca6122e..000000000 --- a/misc/config_tools/configurator/src/lib/bs4rjsf/ColorWidget/ColorWidget.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import React from "react"; -import {WidgetProps} from "@rjsf/core"; - -const ColorWidget = (props: WidgetProps) => { - const {registry} = props; - const {TextWidget} = registry.widgets; - return ; -}; - -export default ColorWidget; diff --git a/misc/config_tools/configurator/src/lib/bs4rjsf/ColorWidget/index.ts b/misc/config_tools/configurator/src/lib/bs4rjsf/ColorWidget/index.ts deleted file mode 100644 index eecf91373..000000000 --- a/misc/config_tools/configurator/src/lib/bs4rjsf/ColorWidget/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export {default} from "./ColorWidget"; -export * from "./ColorWidget"; diff --git a/misc/config_tools/configurator/src/lib/bs4rjsf/DateTimeWidget/DateTimeWidget.tsx b/misc/config_tools/configurator/src/lib/bs4rjsf/DateTimeWidget/DateTimeWidget.tsx deleted file mode 100644 index 74087e299..000000000 --- a/misc/config_tools/configurator/src/lib/bs4rjsf/DateTimeWidget/DateTimeWidget.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import React from "react"; -import {utils, WidgetProps} from "@rjsf/core"; - -const {localToUTC, utcToLocal} = utils; - -const DateTimeWidget = (props: WidgetProps) => { - const {registry} = props; - const {TextWidget} = registry.widgets; - const value = utcToLocal(props.value); - const onChange = (value: any) => { - props.onChange(localToUTC(value)); - }; - - return ( - - ); -}; - -export default DateTimeWidget; diff --git a/misc/config_tools/configurator/src/lib/bs4rjsf/DateTimeWidget/index.ts b/misc/config_tools/configurator/src/lib/bs4rjsf/DateTimeWidget/index.ts deleted file mode 100644 index f412f0cb8..000000000 --- a/misc/config_tools/configurator/src/lib/bs4rjsf/DateTimeWidget/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export {default} from "./DateTimeWidget"; -export * from "./DateTimeWidget"; diff --git a/misc/config_tools/configurator/src/lib/bs4rjsf/DateWidget/DateWidget.tsx b/misc/config_tools/configurator/src/lib/bs4rjsf/DateWidget/DateWidget.tsx deleted file mode 100644 index d8b99a62c..000000000 --- a/misc/config_tools/configurator/src/lib/bs4rjsf/DateWidget/DateWidget.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import React from "react"; -import {WidgetProps} from "@rjsf/core"; - -const DateWidget = (props: WidgetProps) => { - const {registry} = props; - const {TextWidget} = registry.widgets; - return ( - - ); -}; - -export default DateWidget; diff --git a/misc/config_tools/configurator/src/lib/bs4rjsf/DateWidget/index.ts b/misc/config_tools/configurator/src/lib/bs4rjsf/DateWidget/index.ts deleted file mode 100644 index 3260f890b..000000000 --- a/misc/config_tools/configurator/src/lib/bs4rjsf/DateWidget/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export {default} from "./DateWidget"; -export * from "./DateWidget"; diff --git a/misc/config_tools/configurator/src/lib/bs4rjsf/DescriptionField/DescriptionField.tsx b/misc/config_tools/configurator/src/lib/bs4rjsf/DescriptionField/DescriptionField.tsx deleted file mode 100644 index 1fca34ecf..000000000 --- a/misc/config_tools/configurator/src/lib/bs4rjsf/DescriptionField/DescriptionField.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import React from "react"; -import {FieldProps} from "@rjsf/core"; - -export interface DescriptionFieldProps extends Partial { - description?: string; -} - -const DescriptionField = ({description}: Partial) => { - if (description) { - return
    -
    -
    ; - } - - return null; -}; - -export default DescriptionField; diff --git a/misc/config_tools/configurator/src/lib/bs4rjsf/DescriptionField/index.ts b/misc/config_tools/configurator/src/lib/bs4rjsf/DescriptionField/index.ts deleted file mode 100644 index e12b66a3b..000000000 --- a/misc/config_tools/configurator/src/lib/bs4rjsf/DescriptionField/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export {default} from "./DescriptionField"; -export * from "./DescriptionField"; diff --git a/misc/config_tools/configurator/src/lib/bs4rjsf/EmailWidget/EmailWidget.tsx b/misc/config_tools/configurator/src/lib/bs4rjsf/EmailWidget/EmailWidget.tsx deleted file mode 100644 index 581ce00c3..000000000 --- a/misc/config_tools/configurator/src/lib/bs4rjsf/EmailWidget/EmailWidget.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import React from "react"; -import {WidgetProps} from "@rjsf/core"; - -const EmailWidget = (props: WidgetProps) => { - const {registry} = props; - const {TextWidget} = registry.widgets; - return ; -}; - -export default EmailWidget; diff --git a/misc/config_tools/configurator/src/lib/bs4rjsf/EmailWidget/index.ts b/misc/config_tools/configurator/src/lib/bs4rjsf/EmailWidget/index.ts deleted file mode 100644 index 4537a21aa..000000000 --- a/misc/config_tools/configurator/src/lib/bs4rjsf/EmailWidget/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export {default} from "./EmailWidget"; -export * from "./EmailWidget"; diff --git a/misc/config_tools/configurator/src/lib/bs4rjsf/ErrorList/ErrorList.tsx b/misc/config_tools/configurator/src/lib/bs4rjsf/ErrorList/ErrorList.tsx deleted file mode 100644 index 6a9a1bf04..000000000 --- a/misc/config_tools/configurator/src/lib/bs4rjsf/ErrorList/ErrorList.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import React from "react"; - -import Card from "react-bootstrap/Card"; -import ListGroup from "react-bootstrap/ListGroup"; - -import {ErrorListProps} from "@rjsf/core"; - -const ErrorList = ({errors}: ErrorListProps) => ( - - Errors - - - {errors.map((error, i: number) => { - return ( - - {error.stack} - - ); - })} - - - -); - -export default ErrorList; diff --git a/misc/config_tools/configurator/src/lib/bs4rjsf/ErrorList/index.ts b/misc/config_tools/configurator/src/lib/bs4rjsf/ErrorList/index.ts deleted file mode 100644 index 7626610c6..000000000 --- a/misc/config_tools/configurator/src/lib/bs4rjsf/ErrorList/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export {default} from "./ErrorList"; -export * from "./ErrorList"; diff --git a/misc/config_tools/configurator/src/lib/bs4rjsf/FieldTemplate/FieldTemplate.tsx b/misc/config_tools/configurator/src/lib/bs4rjsf/FieldTemplate/FieldTemplate.tsx deleted file mode 100644 index bd318d9f6..000000000 --- a/misc/config_tools/configurator/src/lib/bs4rjsf/FieldTemplate/FieldTemplate.tsx +++ /dev/null @@ -1,171 +0,0 @@ -import React from "react"; - -import {FieldTemplateProps} from "@rjsf/core"; - -import Form from "react-bootstrap/Form"; -import ListGroup from "react-bootstrap/ListGroup"; - -import WrapIfAdditional from "./WrapIfAdditional"; - -import {OverlayTrigger, Popover} from "react-bootstrap"; -import {FontAwesomeIcon} from "@fortawesome/react-fontawesome"; -import {faCircleInfo, faCircleExclamation} from "@fortawesome/free-solid-svg-icons"; -import _ from "lodash"; - -const FieldTemplate = ( - { - id, - children, - displayLabel, - rawErrors = [], - rawHelp, - rawDescription, - classNames, - disabled, - label, - onDropPropertyClick, - onKeyChange, - readonly, - required, - schema, - uiSchema - }: FieldTemplateProps) => { - - let descLabel = (uiSchema.hasOwnProperty("ui:descLabel") && uiSchema["ui:descLabel"] === true) - let descWithChildren - let showLabel = _.endsWith(id, 'IVSHMEM_VM_0_VBDF') || _.endsWith(id, 'IVSHMEM_VM_0_VM_NAME') || ( - id.indexOf('vuart_connection') > 0 && (_.endsWith(id, 'vm_name') || _.endsWith(id, 'io_port')) - ) - let dlva = uiSchema.hasOwnProperty("ui:descLabelAli") && uiSchema["ui:descLabelAli"] === 'V' - if (displayLabel && rawDescription) { - let desc - const icon = rawErrors.length > 0 ? faCircleExclamation : faCircleInfo; - if (descLabel) { - if (dlva) { - desc = - - 0 ? "text-danger" : "text-muted"} - dangerouslySetInnerHTML={{__html: rawDescription}}/> - - - }> -
    - 0 ? "text-danger" : "")}> - {uiSchema["ui:title"] || schema.title || label} - {(label || uiSchema["ui:title"] || schema.title) && required ? "*" : null} - -
    -
    - descWithChildren =
    - {desc} -
    - {children} -
    -
    - } else { - desc = - - 0 ? "text-danger" : "text-muted"} - dangerouslySetInnerHTML={{__html: rawDescription}}/> - - - }> -
    - 0 ? "text-danger" : "")}> - {uiSchema["ui:title"] || schema.title || label} - {(label || uiSchema["ui:title"] || schema.title) && required ? "*" : null} - -
    -
    - descWithChildren =
    - {desc} -
    - {children} -
    -
    - } - } else { - desc = - - 0 ? "text-danger" : "text-muted"} - dangerouslySetInnerHTML={{__html: rawDescription}}/> - - - }> -
    - 0 ? "red" : ""} - /> -
    -
    - descWithChildren =
    - {desc} -
    - {children} -
    -
    - } - - - } else { - descWithChildren = children - } - return ( - - - {descWithChildren} - {rawErrors.length > 0 && ( - - {rawErrors.map((error: string) => { - return ( - - - {error} - - - ); - })} - - )} - {rawHelp && ( - 0 ? "text-danger" : "text-muted"} - id={id}> - {rawHelp} - - )} - - - ); -}; - -export default FieldTemplate; diff --git a/misc/config_tools/configurator/src/lib/bs4rjsf/FieldTemplate/WrapIfAdditional.tsx b/misc/config_tools/configurator/src/lib/bs4rjsf/FieldTemplate/WrapIfAdditional.tsx deleted file mode 100644 index fb2310da9..000000000 --- a/misc/config_tools/configurator/src/lib/bs4rjsf/FieldTemplate/WrapIfAdditional.tsx +++ /dev/null @@ -1,83 +0,0 @@ -import React from "react"; - -import {utils} from "@rjsf/core"; -import {JSONSchema7} from "json-schema"; - -import Row from "react-bootstrap/Row"; -import Col from "react-bootstrap/Col"; -import Form from "react-bootstrap/Form"; - -import IconButton from "../IconButton/IconButton"; - -const {ADDITIONAL_PROPERTY_FLAG} = utils; - -type WrapIfAdditionalProps = { - children: React.ReactElement; - classNames: string; - disabled: boolean; - id: string; - label: string; - onDropPropertyClick: (index: string) => (event?: any) => void; - onKeyChange: (index: string) => (event?: any) => void; - readonly: boolean; - required: boolean; - schema: JSONSchema7; -}; - -const WrapIfAdditional = ({ - children, - disabled, - id, - label, - onDropPropertyClick, - onKeyChange, - readonly, - required, - schema, - }: WrapIfAdditionalProps) => { - const keyLabel = `${label} Key`; // i18n ? - const additional = schema.hasOwnProperty(ADDITIONAL_PROPERTY_FLAG); - - if (!additional) { - return children; - } - - const handleBlur = ({target}: React.FocusEvent) => - onKeyChange(target.value); - - return ( - - - - {keyLabel} - - - - - {children} - - - - - - ); -}; - -export default WrapIfAdditional; diff --git a/misc/config_tools/configurator/src/lib/bs4rjsf/FieldTemplate/index.ts b/misc/config_tools/configurator/src/lib/bs4rjsf/FieldTemplate/index.ts deleted file mode 100644 index 8d6d06eb6..000000000 --- a/misc/config_tools/configurator/src/lib/bs4rjsf/FieldTemplate/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export {default} from "./FieldTemplate"; -export * from "./FieldTemplate"; diff --git a/misc/config_tools/configurator/src/lib/bs4rjsf/Fields/Fields.ts b/misc/config_tools/configurator/src/lib/bs4rjsf/Fields/Fields.ts deleted file mode 100644 index adb32d9f2..000000000 --- a/misc/config_tools/configurator/src/lib/bs4rjsf/Fields/Fields.ts +++ /dev/null @@ -1,7 +0,0 @@ -import DescriptionField from "../DescriptionField/DescriptionField"; -import TitleField from "../TitleField/TitleField"; - -export default { - DescriptionField, - TitleField, -}; diff --git a/misc/config_tools/configurator/src/lib/bs4rjsf/Fields/index.ts b/misc/config_tools/configurator/src/lib/bs4rjsf/Fields/index.ts deleted file mode 100644 index faa3dcbc3..000000000 --- a/misc/config_tools/configurator/src/lib/bs4rjsf/Fields/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export {default} from "./Fields"; -export * from "./Fields"; diff --git a/misc/config_tools/configurator/src/lib/bs4rjsf/FileWidget/FileWidget.tsx b/misc/config_tools/configurator/src/lib/bs4rjsf/FileWidget/FileWidget.tsx deleted file mode 100644 index 511c28e44..000000000 --- a/misc/config_tools/configurator/src/lib/bs4rjsf/FileWidget/FileWidget.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import React from "react"; -import {WidgetProps} from "@rjsf/core"; - -const FileWidget = (props: WidgetProps) => { - const {registry} = props; - const {TextWidget} = registry.widgets; - return ; -}; - -export default FileWidget; diff --git a/misc/config_tools/configurator/src/lib/bs4rjsf/FileWidget/index.ts b/misc/config_tools/configurator/src/lib/bs4rjsf/FileWidget/index.ts deleted file mode 100644 index 558890e80..000000000 --- a/misc/config_tools/configurator/src/lib/bs4rjsf/FileWidget/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export {default} from "./FileWidget"; -export * from "./FileWidget"; diff --git a/misc/config_tools/configurator/src/lib/bs4rjsf/Form/Form.tsx b/misc/config_tools/configurator/src/lib/bs4rjsf/Form/Form.tsx deleted file mode 100644 index 971c6b565..000000000 --- a/misc/config_tools/configurator/src/lib/bs4rjsf/Form/Form.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import {withTheme, FormProps} from "@rjsf/core"; - -import Theme from "../Theme"; -import {StatelessComponent} from "react"; - -const Form: - | React.ComponentClass> - | StatelessComponent> = withTheme(Theme); - -export default Form; diff --git a/misc/config_tools/configurator/src/lib/bs4rjsf/Form/index.ts b/misc/config_tools/configurator/src/lib/bs4rjsf/Form/index.ts deleted file mode 100644 index 243aa7b6d..000000000 --- a/misc/config_tools/configurator/src/lib/bs4rjsf/Form/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export {default} from "./Form"; -export * from "./Form"; diff --git a/misc/config_tools/configurator/src/lib/bs4rjsf/IconButton/IconButton.tsx b/misc/config_tools/configurator/src/lib/bs4rjsf/IconButton/IconButton.tsx deleted file mode 100644 index 062708166..000000000 --- a/misc/config_tools/configurator/src/lib/bs4rjsf/IconButton/IconButton.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import React from "react"; -import Button, {ButtonProps} from "react-bootstrap/Button"; -import {IoIosRemove} from "react-icons/io"; -import {GrAdd} from "react-icons/gr"; -import {AiOutlineArrowUp, AiOutlineArrowDown} from "react-icons/ai"; - -const mappings: any = { - remove: , - plus: , - "arrow-up": , - "arrow-down": , -}; - -type IconButtonProps = ButtonProps & { - icon: string; - variant?: ButtonProps["variant"]; - className?: string; - tabIndex?: number; - style?: any; - disabled?: any; - onClick?: any; -}; - -const IconButton = (props: IconButtonProps) => { - const {icon, className, ...otherProps} = props; - return ( - - ); -}; - -export default IconButton; diff --git a/misc/config_tools/configurator/src/lib/bs4rjsf/IconButton/index.ts b/misc/config_tools/configurator/src/lib/bs4rjsf/IconButton/index.ts deleted file mode 100644 index 36cd49eb5..000000000 --- a/misc/config_tools/configurator/src/lib/bs4rjsf/IconButton/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export {default} from "./IconButton"; -export * from "./IconButton"; diff --git a/misc/config_tools/configurator/src/lib/bs4rjsf/ObjectFieldTemplate/ObjectFieldTemplate.tsx b/misc/config_tools/configurator/src/lib/bs4rjsf/ObjectFieldTemplate/ObjectFieldTemplate.tsx deleted file mode 100644 index 8f99c2465..000000000 --- a/misc/config_tools/configurator/src/lib/bs4rjsf/ObjectFieldTemplate/ObjectFieldTemplate.tsx +++ /dev/null @@ -1,81 +0,0 @@ -import React from "react"; - -import Row from "react-bootstrap/Row"; -import Col from "react-bootstrap/Col"; -import Container from "react-bootstrap/Container"; - -import {ObjectFieldTemplateProps} from "@rjsf/core"; -import {utils} from "@rjsf/core"; - -import AddButton from "../AddButton/AddButton"; - -const {canExpand} = utils; - -const ObjectFieldTemplate = ( - { - DescriptionField, - description, - TitleField, - title, - properties, - required, - uiSchema, - idSchema, - schema, - formData, - onAddClick, - disabled, - readonly, - }: ObjectFieldTemplateProps) => { - let content = properties.map((element: any, index: number) => { - return ( - - {element.content} - - ); - }) - let expand = canExpand(schema, uiSchema, formData) ? ( - - - - - - ) : null - - let container = - {content} - {expand} - - - return ( - <> - {(uiSchema["ui:title"] || title) && ( - - )} - {description && ( - - )} - {container} - - ); -}; - -export default ObjectFieldTemplate; diff --git a/misc/config_tools/configurator/src/lib/bs4rjsf/ObjectFieldTemplate/index.ts b/misc/config_tools/configurator/src/lib/bs4rjsf/ObjectFieldTemplate/index.ts deleted file mode 100644 index 1c56e5023..000000000 --- a/misc/config_tools/configurator/src/lib/bs4rjsf/ObjectFieldTemplate/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export {default} from "./ObjectFieldTemplate"; -export * from "./ObjectFieldTemplate"; diff --git a/misc/config_tools/configurator/src/lib/bs4rjsf/PasswordWidget/PasswordWidget.tsx b/misc/config_tools/configurator/src/lib/bs4rjsf/PasswordWidget/PasswordWidget.tsx deleted file mode 100644 index ad187fb55..000000000 --- a/misc/config_tools/configurator/src/lib/bs4rjsf/PasswordWidget/PasswordWidget.tsx +++ /dev/null @@ -1,55 +0,0 @@ -import React from "react"; - -import Form from "react-bootstrap/Form"; - -import {WidgetProps} from "@rjsf/core"; - -const PasswordWidget = ({ - id, - required, - readonly, - disabled, - value, - label, - onFocus, - onBlur, - onChange, - options, - autofocus, - schema, - rawErrors = [], - }: WidgetProps) => { - const _onChange = ({ - target: {value}, - }: React.ChangeEvent) => - onChange(value === "" ? options.emptyValue : value); - const _onBlur = ({target: {value}}: React.FocusEvent) => - onBlur(id, value); - const _onFocus = ({ - target: {value}, - }: React.FocusEvent) => onFocus(id, value); - - return ( - - 0 ? "text-danger" : ""}> - {label || schema.title} - {(label || schema.title) && required ? "*" : null} - - 0 ? "is-invalid" : ""} - required={required} - disabled={disabled} - readOnly={readonly} - type="password" - value={value ? value : ""} - onFocus={_onFocus} - onBlur={_onBlur} - onChange={_onChange} - /> - - ); -}; - -export default PasswordWidget; diff --git a/misc/config_tools/configurator/src/lib/bs4rjsf/PasswordWidget/index.ts b/misc/config_tools/configurator/src/lib/bs4rjsf/PasswordWidget/index.ts deleted file mode 100644 index ad9455bc9..000000000 --- a/misc/config_tools/configurator/src/lib/bs4rjsf/PasswordWidget/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export {default} from "./PasswordWidget"; -export * from "./PasswordWidget"; diff --git a/misc/config_tools/configurator/src/lib/bs4rjsf/RadioWidget/RadioWidget.tsx b/misc/config_tools/configurator/src/lib/bs4rjsf/RadioWidget/RadioWidget.tsx deleted file mode 100644 index 80fa2594e..000000000 --- a/misc/config_tools/configurator/src/lib/bs4rjsf/RadioWidget/RadioWidget.tsx +++ /dev/null @@ -1,70 +0,0 @@ -import React from "react"; - -import Form from "react-bootstrap/Form"; - -import {WidgetProps} from "@rjsf/core"; - -const RadioWidget = ( - { - id, - schema, - options, - value, - required, - disabled, - readonly, - label, - onChange, - onBlur, - onFocus, - uiSchema, - }: WidgetProps) => { - const {enumOptions, enumDisabled} = options; - - const _onChange = ({target: {value},}: React.ChangeEvent) => - onChange(schema.type == "boolean" ? value !== "false" : value); - const _onBlur = ({target: {value}}: React.FocusEvent) => - onBlur(id, value); - const _onFocus = ({target: {value},}: React.FocusEvent) => onFocus(id, value); - - const inline = Boolean(options && options.inline); - - return ( - - - {uiSchema["ui:title"] || schema.title || label} - {(label || uiSchema["ui:title"] || schema.title) && required ? "*" : null} - -
    - {(enumOptions as any).map((option: any, i: number) => { - const itemDisabled = - Array.isArray(enumDisabled) && - enumDisabled.indexOf(option.value) !== -1; - const checked = option.value == value; - - // @ts-ignore - const radio = ( - - ); - return radio; - })} -
    -
    - ); -}; - -export default RadioWidget; diff --git a/misc/config_tools/configurator/src/lib/bs4rjsf/RadioWidget/index.ts b/misc/config_tools/configurator/src/lib/bs4rjsf/RadioWidget/index.ts deleted file mode 100644 index d461a901c..000000000 --- a/misc/config_tools/configurator/src/lib/bs4rjsf/RadioWidget/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export {default} from "./RadioWidget"; -export * from "./RadioWidget"; diff --git a/misc/config_tools/configurator/src/lib/bs4rjsf/RangeWidget/RangeWidget.tsx b/misc/config_tools/configurator/src/lib/bs4rjsf/RangeWidget/RangeWidget.tsx deleted file mode 100644 index 9eeb38122..000000000 --- a/misc/config_tools/configurator/src/lib/bs4rjsf/RangeWidget/RangeWidget.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import React from "react"; - -import Form from "react-bootstrap/Form"; - -import {utils} from "@rjsf/core"; -import {WidgetProps} from "@rjsf/core"; - -const {rangeSpec} = utils; - -const RangeWidget = ({ - value, - readonly, - disabled, - onBlur, - onFocus, - options, - schema, - onChange, - required, - label, - id, - uiSchema, - }: WidgetProps) => { - let sliderProps = {value, label, id, ...rangeSpec(schema)}; - - const _onChange = ({ - target: {value}, - }: React.ChangeEvent) => - onChange(value === "" ? options.emptyValue : value); - const _onBlur = ({target: {value}}: React.FocusEvent) => - onBlur(id, value); - const _onFocus = ({ - target: {value}, - }: React.FocusEvent) => onFocus(id, value); - - return ( - - - {uiSchema["ui:title"] || schema.title || label} - {(label || uiSchema["ui:title"] || schema.title) && required ? "*" : null} - - - {value} - - ); -}; - -export default RangeWidget; diff --git a/misc/config_tools/configurator/src/lib/bs4rjsf/RangeWidget/index.ts b/misc/config_tools/configurator/src/lib/bs4rjsf/RangeWidget/index.ts deleted file mode 100644 index f43ff7464..000000000 --- a/misc/config_tools/configurator/src/lib/bs4rjsf/RangeWidget/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export {default} from "./RangeWidget"; -export * from "./RangeWidget"; diff --git a/misc/config_tools/configurator/src/lib/bs4rjsf/SelectWidget/SelectWidget.tsx b/misc/config_tools/configurator/src/lib/bs4rjsf/SelectWidget/SelectWidget.tsx deleted file mode 100644 index 5a9c7b813..000000000 --- a/misc/config_tools/configurator/src/lib/bs4rjsf/SelectWidget/SelectWidget.tsx +++ /dev/null @@ -1,132 +0,0 @@ -import React from "react"; - -import Form from "react-bootstrap/Form"; - -import {WidgetProps} from "@rjsf/core"; -import {utils} from "@rjsf/core"; - -const {asNumber, guessType} = utils; - -const nums = new Set(["number", "integer"]); - -/** - * This is a silly limitation in the DOM where option change event values are - * always retrieved as strings. - */ -const processValue = (schema: any, value: any) => { - // "enum" is a reserved word, so only "type" and "items" can be destructured - const {type, items} = schema; - if (value === "") { - return undefined; - } else if (type === "array" && items && nums.has(items.type)) { - return value.map(asNumber); - } else if (type === "boolean") { - return value === "true"; - } else if (type === "number") { - return asNumber(value); - } - - // If type is undefined, but an enum is present, try and infer the type from - // the enum values - if (schema.enum) { - if (schema.enum.every((x: any) => guessType(x) === "number")) { - return asNumber(value); - } else if (schema.enum.every((x: any) => guessType(x) === "boolean")) { - return value === "true"; - } - } - - return value; -}; - -const SelectWidget = ( - { - schema, - id, - options, - label, - required, - disabled, - readonly, - value, - multiple, - autofocus, - onChange, - onBlur, - onFocus, - placeholder, - rawErrors = [], - }: WidgetProps) => { - const {enumOptions, enumDisabled} = options; - - const emptyValue = multiple ? [] : ""; - - function getValue( - event: React.FocusEvent | React.ChangeEvent | any, - multiple: Boolean, - ) { - if (multiple) { - return [].slice - .call(event.target.options as any) - .filter((o: any) => o.selected) - .map((o: any) => o.value); - } else { - return event.target.value; - } - } - - return ( - - 0 ? "text-danger" : "")}> - {label || schema.title} - {(label || schema.title) && required ? "*" : null} - -
    - 0 ? "is-invalid" : "")} - onBlur={ - onBlur && - ((event: React.FocusEvent) => { - const newValue = getValue(event, multiple); - onBlur(id, processValue(schema, newValue)); - }) - } - onFocus={ - onFocus && - ((event: React.FocusEvent) => { - const newValue = getValue(event, multiple); - onFocus(id, processValue(schema, newValue)); - }) - } - onChange={(event: React.ChangeEvent) => { - const newValue = getValue(event, multiple); - onChange(processValue(schema, newValue)); - }}> - {!multiple && schema.default === undefined && ( - - )} - {(enumOptions as any).map(({value, label}: any, i: number) => { - const disabled: any = - Array.isArray(enumDisabled) && - (enumDisabled as any).indexOf(value) != -1; - return ( - - ); - })} - -
    -
    - ); -}; - -export default SelectWidget; diff --git a/misc/config_tools/configurator/src/lib/bs4rjsf/SelectWidget/index.ts b/misc/config_tools/configurator/src/lib/bs4rjsf/SelectWidget/index.ts deleted file mode 100644 index 6e104f2ea..000000000 --- a/misc/config_tools/configurator/src/lib/bs4rjsf/SelectWidget/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export {default} from "./SelectWidget"; -export * from "./SelectWidget"; diff --git a/misc/config_tools/configurator/src/lib/bs4rjsf/TextWidget/TextWidget.tsx b/misc/config_tools/configurator/src/lib/bs4rjsf/TextWidget/TextWidget.tsx deleted file mode 100644 index ea491c296..000000000 --- a/misc/config_tools/configurator/src/lib/bs4rjsf/TextWidget/TextWidget.tsx +++ /dev/null @@ -1,74 +0,0 @@ -import React from "react"; - -import Form from "react-bootstrap/Form"; - -import {WidgetProps} from "@rjsf/core"; - -const TextWidget = ( - { - id, - placeholder, - required, - readonly, - disabled, - type, - label, - value, - onChange, - onBlur, - onFocus, - autofocus, - options, - schema, - rawErrors = [], - uiSchema, - }: WidgetProps) => { - const _onChange = ({ - target: {value}, - }: React.ChangeEvent) => - onChange(value === "" ? options.emptyValue : value); - const _onBlur = ({target: {value}}: React.FocusEvent) => - onBlur(id, value); - const _onFocus = ({ - target: {value}, - }: React.FocusEvent) => onFocus(id, value); - const inputType = (type || schema.type) === "string" ? "text" : `${type || schema.type}`; - - // const classNames = [rawErrors.length > 0 ? "is-invalid" : "", type === 'file' ? 'custom-file-label': ""] - return ( - - 0 ? "text-danger" : "")}> - {uiSchema["ui:title"] || schema.title || label} - {(label || uiSchema["ui:title"] || schema.title) && required ? "*" : null} - -
    - 0 ? "is-invalid" : ""} - list={schema.examples ? `examples_${id}` : undefined} - type={inputType} - value={value || value === 0 ? value : ""} - onChange={_onChange} - onBlur={_onBlur} - onFocus={_onFocus} - /> -
    - {schema.examples ? ( - - {(schema.examples as string[]) - .concat(schema.default ? ([schema.default] as string[]) : []) - .map((example: any) => { - return - ) : null} -
    - ); -}; - -export default TextWidget; diff --git a/misc/config_tools/configurator/src/lib/bs4rjsf/TextWidget/index.ts b/misc/config_tools/configurator/src/lib/bs4rjsf/TextWidget/index.ts deleted file mode 100644 index e7e838908..000000000 --- a/misc/config_tools/configurator/src/lib/bs4rjsf/TextWidget/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export {default} from "./TextWidget"; -export * from "./TextWidget"; diff --git a/misc/config_tools/configurator/src/lib/bs4rjsf/TextareaWidget/TextareaWidget.tsx b/misc/config_tools/configurator/src/lib/bs4rjsf/TextareaWidget/TextareaWidget.tsx deleted file mode 100644 index 763efb975..000000000 --- a/misc/config_tools/configurator/src/lib/bs4rjsf/TextareaWidget/TextareaWidget.tsx +++ /dev/null @@ -1,71 +0,0 @@ -import React from "react"; - -import {WidgetProps} from "@rjsf/core"; -import FormControl from "react-bootstrap/FormControl"; -import InputGroup from "react-bootstrap/InputGroup"; - -type CustomWidgetProps = WidgetProps & { - options: any; -}; - -const TextareaWidget = ({ - id, - placeholder, - value, - required, - disabled, - autofocus, - label, - readonly, - onBlur, - onFocus, - onChange, - options, - schema, - rawErrors = [], - uiSchema, - }: CustomWidgetProps) => { - const _onChange = ({ - target: {value}, - }: React.ChangeEvent) => - onChange(value === "" ? options.emptyValue : value); - const _onBlur = ({ - target: {value}, - }: React.FocusEvent) => onBlur(id, value); - const _onFocus = ({ - target: {value}, - }: React.FocusEvent) => onFocus(id, value); - - return ( - <> - - - - - - ); -}; - -export default TextareaWidget; diff --git a/misc/config_tools/configurator/src/lib/bs4rjsf/TextareaWidget/index.ts b/misc/config_tools/configurator/src/lib/bs4rjsf/TextareaWidget/index.ts deleted file mode 100644 index cbcf0b8f3..000000000 --- a/misc/config_tools/configurator/src/lib/bs4rjsf/TextareaWidget/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export {default} from "./TextareaWidget"; -export * from "./TextareaWidget"; diff --git a/misc/config_tools/configurator/src/lib/bs4rjsf/Theme/Theme.tsx b/misc/config_tools/configurator/src/lib/bs4rjsf/Theme/Theme.tsx deleted file mode 100644 index b3b0fc179..000000000 --- a/misc/config_tools/configurator/src/lib/bs4rjsf/Theme/Theme.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import React from "react"; - -import Button from "react-bootstrap/Button"; - -import ArrayFieldTemplate from "../ArrayFieldTemplate"; -import ErrorList from "../ErrorList"; -import Fields from "../Fields"; -import FieldTemplate from "../FieldTemplate"; -import ObjectFieldTemplate from "../ObjectFieldTemplate"; -import Widgets from "../Widgets"; - -import {ThemeProps} from "@rjsf/core"; -import {utils} from "@rjsf/core"; - -const {getDefaultRegistry} = utils; - -const {fields, widgets} = getDefaultRegistry(); - -const DefaultChildren = () => ( -
    - -
    -); - -const Theme: ThemeProps = { - children: , - ArrayFieldTemplate, - fields: {...fields, ...Fields}, - FieldTemplate, - ObjectFieldTemplate, - widgets: {...widgets, ...Widgets}, - ErrorList, -}; - -export default Theme; diff --git a/misc/config_tools/configurator/src/lib/bs4rjsf/Theme/index.ts b/misc/config_tools/configurator/src/lib/bs4rjsf/Theme/index.ts deleted file mode 100644 index 2398c7502..000000000 --- a/misc/config_tools/configurator/src/lib/bs4rjsf/Theme/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export {default} from "./Theme"; -export * from "./Theme"; diff --git a/misc/config_tools/configurator/src/lib/bs4rjsf/TitleField/TitleField.tsx b/misc/config_tools/configurator/src/lib/bs4rjsf/TitleField/TitleField.tsx deleted file mode 100644 index ee6067da2..000000000 --- a/misc/config_tools/configurator/src/lib/bs4rjsf/TitleField/TitleField.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import React from "react"; -import {FieldProps} from "@rjsf/core"; - -export interface TitleFieldProps extends Partial { - title: string; -} - -const TitleField = ({title, uiSchema}: Partial) => ( - <> -
    -
    {(uiSchema && uiSchema["ui:title"]) || title}
    -
    -
    - -); - -export default TitleField; diff --git a/misc/config_tools/configurator/src/lib/bs4rjsf/TitleField/index.ts b/misc/config_tools/configurator/src/lib/bs4rjsf/TitleField/index.ts deleted file mode 100644 index 51ee5dd17..000000000 --- a/misc/config_tools/configurator/src/lib/bs4rjsf/TitleField/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export {default} from "./TitleField"; -export * from "./TitleField"; diff --git a/misc/config_tools/configurator/src/lib/bs4rjsf/URLWidget/URLWidget.tsx b/misc/config_tools/configurator/src/lib/bs4rjsf/URLWidget/URLWidget.tsx deleted file mode 100644 index ff7972a63..000000000 --- a/misc/config_tools/configurator/src/lib/bs4rjsf/URLWidget/URLWidget.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import React from "react"; -import {WidgetProps} from "@rjsf/core"; - -const URLWidget = (props: WidgetProps) => { - const {registry} = props; - const {TextWidget} = registry.widgets; - return ; -}; - -export default URLWidget; diff --git a/misc/config_tools/configurator/src/lib/bs4rjsf/URLWidget/index.ts b/misc/config_tools/configurator/src/lib/bs4rjsf/URLWidget/index.ts deleted file mode 100644 index 6aaa0378e..000000000 --- a/misc/config_tools/configurator/src/lib/bs4rjsf/URLWidget/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export {default} from "./URLWidget"; -export * from "./URLWidget"; diff --git a/misc/config_tools/configurator/src/lib/bs4rjsf/UpDownWidget/UpDownWidget.tsx b/misc/config_tools/configurator/src/lib/bs4rjsf/UpDownWidget/UpDownWidget.tsx deleted file mode 100644 index 8a732e1c2..000000000 --- a/misc/config_tools/configurator/src/lib/bs4rjsf/UpDownWidget/UpDownWidget.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import React from "react"; - -import Form from "react-bootstrap/Form"; - -import {WidgetProps} from "@rjsf/core"; - -const UpDownWidget = ({ - id, - required, - readonly, - disabled, - label, - value, - onChange, - onBlur, - onFocus, - autofocus, - schema, - uiSchema, - }: WidgetProps) => { - const _onChange = ({ - target: {value}, - }: React.ChangeEvent) => onChange(value); - const _onBlur = ({target: {value}}: React.FocusEvent) => - onBlur(id, value); - const _onFocus = ({ - target: {value}, - }: React.FocusEvent) => onFocus(id, value); - - return ( - - - {uiSchema["ui:title"] || schema.title || label} - {(label || uiSchema["ui:title"] || schema.title) && required ? "*" : null} - - - - ); -}; - -export default UpDownWidget; diff --git a/misc/config_tools/configurator/src/lib/bs4rjsf/UpDownWidget/index.ts b/misc/config_tools/configurator/src/lib/bs4rjsf/UpDownWidget/index.ts deleted file mode 100644 index 4097027b7..000000000 --- a/misc/config_tools/configurator/src/lib/bs4rjsf/UpDownWidget/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export {default} from "./UpDownWidget"; -export * from "./UpDownWidget"; diff --git a/misc/config_tools/configurator/src/lib/bs4rjsf/Widgets/Widgets.ts b/misc/config_tools/configurator/src/lib/bs4rjsf/Widgets/Widgets.ts deleted file mode 100644 index cfd1a5b54..000000000 --- a/misc/config_tools/configurator/src/lib/bs4rjsf/Widgets/Widgets.ts +++ /dev/null @@ -1,33 +0,0 @@ -import CheckboxWidget from "../CheckboxWidget/CheckboxWidget"; -import CheckboxesWidget from "../CheckboxesWidget/CheckboxesWidget"; -import ColorWidget from "../ColorWidget/ColorWidget"; -import DateWidget from "../DateWidget/DateWidget"; -import DateTimeWidget from "../DateTimeWidget/DateTimeWidget"; -import EmailWidget from "../EmailWidget/EmailWidget"; -import PasswordWidget from "../PasswordWidget/PasswordWidget"; -import RadioWidget from "../RadioWidget/RadioWidget"; -import RangeWidget from "../RangeWidget/RangeWidget"; -import SelectWidget from "../SelectWidget/SelectWidget"; -import TextareaWidget from "../TextareaWidget/TextareaWidget"; -import TextWidget from "../TextWidget/TextWidget"; -import UpDownWidget from "../UpDownWidget/UpDownWidget"; -import URLWidget from "../URLWidget/URLWidget"; -import FileWidget from "../FileWidget/FileWidget"; - -export default { - CheckboxWidget, - CheckboxesWidget, - ColorWidget, - DateWidget, - DateTimeWidget, - EmailWidget, - PasswordWidget, - RadioWidget, - RangeWidget, - SelectWidget, - TextareaWidget, - TextWidget, - UpDownWidget, - URLWidget, - FileWidget, -}; diff --git a/misc/config_tools/configurator/src/lib/bs4rjsf/Widgets/index.ts b/misc/config_tools/configurator/src/lib/bs4rjsf/Widgets/index.ts deleted file mode 100644 index 91b5756bc..000000000 --- a/misc/config_tools/configurator/src/lib/bs4rjsf/Widgets/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export {default} from "./Widgets"; -export * from "./Widgets"; diff --git a/misc/config_tools/configurator/src/lib/bs4rjsf/index.ts b/misc/config_tools/configurator/src/lib/bs4rjsf/index.ts deleted file mode 100644 index 2e1e8faf8..000000000 --- a/misc/config_tools/configurator/src/lib/bs4rjsf/index.ts +++ /dev/null @@ -1,10 +0,0 @@ -import Form from "./Form/Form"; - -export {default as Fields} from "./Fields"; -export {default as FieldTemplate} from "./FieldTemplate"; -export {default as Form} from "./Form"; -export {default as ObjectFieldTemplate} from "./ObjectFieldTemplate"; -export {default as Theme} from "./Theme"; -export {default as Widgets} from "./Widgets"; - -export default Form; diff --git a/misc/config_tools/configurator/src/lib/helper.jsx b/misc/config_tools/configurator/src/lib/helper.jsx deleted file mode 100644 index 65e507862..000000000 --- a/misc/config_tools/configurator/src/lib/helper.jsx +++ /dev/null @@ -1,221 +0,0 @@ -import _ from "lodash"; -import xml2json, {parseXml} from "./xml2json"; -import JSON2XML from "./json2xml"; - -import {fs, path} from "@tauri-apps/api" - - -// noinspection JSUnresolvedFunction,JSUnresolvedVariable -class BackendBase { - listConfig = async () => { - await this.init - - let config = await this.read(this.configPath) - if (config == null) { - return {} - } - try { - config = JSON.parse(config) - } catch (e) { - return {} - } - return config - } - - getConfig = async (key, defaultValue) => { - let config = await this.listConfig() - console.log(key, config, defaultValue) - if (config.hasOwnProperty(key)) { - return config[key] - } - return defaultValue - } - - setConfig = async (key, value) => { - let config = await this.listConfig() - config[key] = value - config = JSON.stringify(config) - await this.write(this.configPath, config) - } - - read = async () => { - throw new Error('Not Impl') - } - write = async () => { - throw new Error('Not Impl') - } - list = async () => { - throw new Error('Not Impl') - } - remove = async () => { - throw new Error('Not Impl') - } -} - -export class LocalStorageBackend extends BackendBase { - constructor() { - super() - this.rootFSName = 'acrn-configurator' - this.configPath = 'config.json' - } - - _readRootFS = () => { - let localStorageFS = localStorage.getItem(this.rootFSName) - if (localStorageFS == null) { - return {} - } - localStorageFS = JSON.parse(localStorageFS) - return localStorageFS - } - - _writeRootFS = (fs) => { - localStorage.setItem(this.rootFSName, JSON.stringify(fs)) - } - - read = async (filePath) => { - let localStorageFS = this._readRootFS() - if (localStorageFS.hasOwnProperty(filePath)) { - return localStorageFS[filePath] - } - return null - } - - write = async (filePath, value) => { - let localStorageFS = this._readRootFS() - localStorageFS[filePath] = value - this._writeRootFS(localStorageFS) - } - list = async (dirPath) => { - let localStorageFS = this._readRootFS() - let dirFiles = [] - for (let filepath in localStorageFS) { - if (_.startsWith(filepath, dirPath)) { - dirFiles.push(filepath) - } - } - return dirFiles - } - remove = async (filename) => { - let localStorageFS = this._readRootFS() - if (localStorageFS.hasOwnProperty(filename)) { - delete localStorageFS[filename] - } - } -} - -export class TauriLocalFSBackend extends BackendBase { - constructor() { - super() - this.init = path.homeDir() - .then(async (dirPath) => { - this.configDir = await path.join(dirPath, '.acrn-configurator') - this.configPath = await path.join(this.configDir, 'config.json') - return fs.readDir(this.configDir) - .catch(async () => { - fs.createDir(this.configDir, {recursive: true}) - .then(() => this.write(this.configPath, "{}")) - .catch((reason) => { - alert("Create config dir failed. Error:" + reason) - }) - }) - }) - } - - - read = async (filePath) => { - await this.init - return await fs.readTextFile(filePath) - .catch(reason => { - // Todo: add isFile function to check perm - // alert("Read file error! Error: " + reason); - return null - }) - } - - write = async (filePath, value) => { - await this.init - return await fs.writeFile({ - path: filePath, - contents: value - }).catch((reason => alert("Write file error! Error: " + reason))) - } - - list = async (dirPath) => { - await this.init - return (await fs.readDir(dirPath)) - .filter((file) => file.children == null) - .map((file) => file.path) - } - - remove = async (filePath) => { - await this.init - return await fs.removeFile(filePath) - } - -} - -export class Helper { - constructor(configBackend, fsBackend) { - this.configBackend = configBackend - this.fsBackend = fsBackend - this.color = { - blue: "#1475b2", - green: "#42c02e", - deepGray: "#606060" - } - } - - log(title, content, backgroundColor = this.color.green) { - console.log( - "%c ".concat(title, " %c ").concat(content, " "), - "padding: 1px; border-radius: 3px 0 0 3px; color: #fff; background: ".concat(this.color.deepGray, ";"), - "padding: 1px; border-radius: 0 3px 3px 0; color: #fff; background: ".concat(backgroundColor, ";") - ) - } - - resolveHome = async (filepath) => { - if (filepath[0] === '~') { - return await path.join(await path.homeDir(), filepath.slice(1)) - } - return filepath; - } - - convertXMLTextToObj = (XMLText) => { - let jsonText = xml2json(parseXml(XMLText)) - // console.log(scenarioData) - return JSON.parse(jsonText) - } - - convertObjToXML = (o) => { - // convert our js object to xml - let json2xml = new JSON2XML() - // noinspection UnnecessaryLocalVariableJS - let xml = json2xml.convert(o) - return xml - } - - read = async filePath => { - return await this.fsBackend.read(filePath) - } - - save = async (filePath, text) => { - await this.fsBackend.write(filePath, text) - }; - - list = async dirPath => { - return await this.fsBackend.list(dirPath) - }; - - remove = async filePath => { - await this.fsBackend.remove(filePath).catch((reason => alert("Remove file failed! Error:" + reason))) - } - - getConfig = async (configKeyName, defaultValue) => { - return await this.configBackend.getConfig(configKeyName, defaultValue) - } - - setConfig = async (configKeyName, value) => { - return await this.configBackend.setConfig(configKeyName, value) - }; - -} diff --git a/misc/config_tools/configurator/src/lib/json2xml.jsx b/misc/config_tools/configurator/src/lib/json2xml.js similarity index 100% rename from misc/config_tools/configurator/src/lib/json2xml.jsx rename to misc/config_tools/configurator/src/lib/json2xml.js diff --git a/misc/config_tools/configurator/src/lib/platform/tauri/tauri.jsx b/misc/config_tools/configurator/src/lib/platform/tauri/tauri.jsx deleted file mode 100644 index 51895534a..000000000 --- a/misc/config_tools/configurator/src/lib/platform/tauri/tauri.jsx +++ /dev/null @@ -1,22 +0,0 @@ -import {appWindow} from "@tauri-apps/api/window"; - -class WindowHelper { - minimal = (cb = null) => { - appWindow.minimize().then(() => { - cb ? cb() : false - }) - } - - maxmal = (cb = null) => { - appWindow.toggleMaximize().then(() => { - cb ? cb() : false - }) - } - - close = () => { - appWindow.close().then() - } -} - - -export const windowHelper = new WindowHelper() \ No newline at end of file diff --git a/misc/config_tools/configurator/src/lib/runpy.jsx b/misc/config_tools/configurator/src/lib/runpy.jsx deleted file mode 100644 index e568764b9..000000000 --- a/misc/config_tools/configurator/src/lib/runpy.jsx +++ /dev/null @@ -1,58 +0,0 @@ -import dynamicScenario from "../assets/schema/dynamicScenario.py" -import scenario_json from "../assets/schema/scenario.json" -import {Base64} from 'js-base64'; - - -function toJSONString(obj) { - if (_.isString(obj)) { - return JSON.stringify(obj) - } - return JSON.stringify(JSON.stringify(obj)) -} - - -async function initPyodide() { - await pyodide.runPythonAsync( - `import micropip -await micropip.install(['elementpath', 'xmlschema']) -`) - return pyodide -} - -initPyodide() - -function runPyCode(pythonCode) { - pyodide.loadPackagesFromImports(pythonCode) - return pyodide.runPython(pythonCode) -} - -function writeFile(filename, content) { - let file_content = JSON.stringify(content) - return runPyCode( - `import json; open(${toJSONString(filename)},'w',encoding='utf-8').write(json.loads(${toJSONString(file_content)}))` - ) -} - -function readFile(filename) { - return runPyCode( - `open(${toJSONString(filename)},'r',encoding='utf-8').read()` - ) -} - -function loadLibrary(libraryName, content) { - return writeFile(`/lib/python3.9/${libraryName}.py`, content) -} - -function getNewSchema(boardXMLText) { - let params = JSON.stringify({board_xml: boardXMLText, scenario_json: JSON.stringify(scenario_json)}) - params = Base64.encode(params); - let scenario_text = runPyCode(` -params="${params}" -${dynamicScenario} -`) - let new_scenario_json = JSON.parse(scenario_text) - console.log(new_scenario_json) - return new_scenario_json -} - -export {runPyCode, readFile, writeFile, getNewSchema} \ No newline at end of file diff --git a/misc/config_tools/configurator/src/lib/xml2json.js b/misc/config_tools/configurator/src/lib/xml2json.js deleted file mode 100644 index f7f933cc6..000000000 --- a/misc/config_tools/configurator/src/lib/xml2json.js +++ /dev/null @@ -1,191 +0,0 @@ -export function parseXml(xml) { - let dom = null; - if (window.DOMParser) { - try { - dom = (new DOMParser()).parseFromString(xml, "text/xml"); - } catch (e) { - dom = null; - } - } else if (window.ActiveXObject) { - try { - dom = new ActiveXObject('Microsoft.XMLDOM'); - dom.async = false; - if (!dom.loadXML(xml)) { - // parse error .. - window.alert(dom.parseError.reason + dom.parseError.srcText); - } - } catch (e) { - dom = null; - } - } else { - alert("cannot parse xml string!"); - } - return dom; -} - -export default function xml2json(xml, tab = "\t") { - let X = { - toObj: function (xml) { - let o = {}; - if (xml.nodeType === 1) { - // element node .. - if (xml.attributes.length) { - // element with attributes .. - for (let i = 0; i < xml.attributes.length; i++) { - o["@" + xml.attributes[i].nodeName] = (xml.attributes[i].nodeValue || "").toString(); - } - } - if (xml.firstChild) { - // element has child nodes .. - let textChild = 0, cdataChild = 0, hasElementChild = false; - for (let n = xml.firstChild; n; n = n.nextSibling) { - if (n.nodeType === 1) { - hasElementChild = true; - } else if (n.nodeType === 3 && n.nodeValue.match(/[^ \f\n\r\t\v]/)) { - // non-whitespace text - textChild++; - } else if (n.nodeType === 4) { - // cdata section node - cdataChild++; - } - } - if (hasElementChild) { - if (textChild < 2 && cdataChild < 2) { - // structured element with evtl. a single text or/and cdata node .. - X.removeWhite(xml); - for (let n = xml.firstChild; n; n = n.nextSibling) { - if (n.nodeType === 3) { - // text node - o["#text"] = X.escape(n.nodeValue); - } else if (n.nodeType === 4) { - // cdata node - o["#cdata"] = X.escape(n.nodeValue); - } else if (o[n.nodeName]) { - // multiple occurence of element .. - if (o[n.nodeName] instanceof Array) { - o[n.nodeName][o[n.nodeName].length] = X.toObj(n); - } else { - o[n.nodeName] = [o[n.nodeName], X.toObj(n)]; - } - - } else { - // first occurence of element.. - o[n.nodeName] = X.toObj(n); - } - } - } else { - // mixed content - if (!xml.attributes.length) { - o = X.escape(X.innerXml(xml)); - } else { - o["#text"] = X.escape(X.innerXml(xml)); - } - } - } else if (textChild) { - // pure text - if (!xml.attributes.length) - o = X.escape(X.innerXml(xml)); - else - o["#text"] = X.escape(X.innerXml(xml)); - } else if (cdataChild) { - // cdata - if (cdataChild > 1) - o = X.escape(X.innerXml(xml)); - else { - for (let n = xml.firstChild; n; n = n.nextSibling) - o["#cdata"] = X.escape(n.nodeValue); - } - } - } - if (!xml.attributes.length && !xml.firstChild) o = null; - } else if (xml.nodeType === 9) { - // document.node - o = X.toObj(xml.documentElement); - } else - alert("unhandled node type: " + xml.nodeType); - return o; - }, - toJson: function (o, name, ind) { - let json = name ? ("\"" + name + "\"") : ""; - if (o instanceof Array) { - for (let i = 0, n = o.length; i < n; i++) - o[i] = X.toJson(o[i], "", ind + "\t"); - json += (name ? ":[" : "[") + (o.length > 1 ? ("\n" + ind + "\t" + o.join(",\n" + ind + "\t") + "\n" + ind) : o.join("")) + "]"; - } else if (o == null) - json += (name && ":") + "null"; - else if (typeof (o) == "object") { - let arr = []; - for (let m in o) - arr[arr.length] = X.toJson(o[m], m, ind + "\t"); - json += (name ? ":{" : "{") + (arr.length > 1 ? ("\n" + ind + "\t" + arr.join(",\n" + ind + "\t") + "\n" + ind) : arr.join("")) + "}"; - } else if (typeof (o) == "string") - json += (name && ":") + "\"" + o.toString() + "\""; - else - json += (name && ":") + o.toString(); - return json; - }, - innerXml: function (node) { - let s = "" - if ("innerHTML" in node) - s = node.innerHTML; - else { - let asXml = function (n) { - let s = ""; - if (n.nodeType === 1) { - s += "<" + n.nodeName; - for (let i = 0; i < n.attributes.length; i++) - s += " " + n.attributes[i].nodeName + "=\"" + (n.attributes[i].nodeValue || "").toString() + "\""; - if (n.firstChild) { - s += ">"; - for (let c = n.firstChild; c; c = c.nextSibling) - s += asXml(c); - s += ""; - } else - s += "/>"; - } else if (n.nodeType === 3) - s += n.nodeValue; - else if (n.nodeType === 4) - s += ""; - return s; - }; - for (let c = node.firstChild; c; c = c.nextSibling) - s += asXml(c); - } - return s; - }, - escape: function (txt) { - return txt.replace(/[\\]/g, "\\\\") - .replace(/["]/g, '\\"') - .replace(/[\n]/g, '\\n') - .replace(/[\r]/g, '\\r'); - }, - removeWhite: function (e) { - e.normalize(); - for (let n = e.firstChild; n;) { - if (n.nodeType === 3) { // text node - if (!n.nodeValue.match(/[^ \f\n\r\t\v]/)) { - // pure whitespace text node - let nxt = n.nextSibling; - e.removeChild(n); - n = nxt; - } else - n = n.nextSibling; - } else if (n.nodeType === 1) { - // element node - X.removeWhite(n); - n = n.nextSibling; - } else { - // any other node - n = n.nextSibling; - } - } - return e; - } - }; - if (xml.nodeType === 9) { - // document node - xml = xml.documentElement; - } - let json = X.toJson(X.toObj(X.removeWhite(xml)), xml.nodeName, "\t"); - return "{\n" + tab + (tab ? json.replace(/\t/g, tab) : json.replace(/[\t\n]/g, "")) + "\n}"; -} diff --git a/misc/config_tools/configurator/src/logo.svg b/misc/config_tools/configurator/src/logo.svg deleted file mode 100644 index 6b60c1042..000000000 --- a/misc/config_tools/configurator/src/logo.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/misc/config_tools/configurator/src/main.js b/misc/config_tools/configurator/src/main.js new file mode 100644 index 000000000..758bf82f9 --- /dev/null +++ b/misc/config_tools/configurator/src/main.js @@ -0,0 +1,102 @@ +const isTauri = !!window.__TAURI_IPC__; +const isRelease = location.host === 'tauri.localhost'; +import VConsole from 'vconsole'; + +if (isRelease) { + const vConsole = new VConsole(); +} + + +import {createApp} from 'vue' +import App from './App.vue' +import {loadPyodide} from "/thirdLib/pyodide/pyodide"; + +import router from "./router"; +import {invoke} from "@tauri-apps/api/tauri"; +import {mockIPC} from "@tauri-apps/api/mocks"; +import BootstrapVue3 from 'bootstrap-vue-3' +import naive from 'naive-ui'; + +const app = createApp(App); +app.use(BootstrapVue3); +app.use(naive); +app.use(router); +app.config.unwrapInjectedRef = true + +if (!isTauri) { + // Patch Browser function to mock Tauri env + const origin_confirm = window.confirm; + window.confirm = async (message) => origin_confirm(message); + + // mock custom tauri command + let tempData = { + history: {WorkingFolder: [], Board: [], Scenario: []} + } + mockIPC(async (cmd, args) => { + if (cmd === 'get_home') { + return 'C:\\Users\\Axel' + } + if (cmd === 'dialogOpenFolder') { + return 'C:\\acrn' + } + if (cmd === 'get_history') { + return JSON.stringify(tempData.history[args.historyType]) + } + if (cmd === 'add_history') { + return tempData.history[args.historyType].push(args.path) + } + if (args?.message?.cmd === "getAppVersion") { + const packageInfo = await import('../package.json'); + return packageInfo.version; + } + + console.log(cmd, args) + return {} + }) +} + +async function main() { + console.log("Pyodide Load Begin") + let t1 = Date.now(); + let pyodide = await loadPyodide(); + await pyodide.loadPackage(['micropip', 'lxml', 'beautifulsoup4']) + await pyodide.runPythonAsync(` + import micropip + await micropip.install([ + './thirdLib/xmltodict-0.12.0-py2.py3-none-any.whl', + './thirdLib/elementpath-2.4.0-py3-none-any.whl', + './thirdLib/defusedxml-0.7.1-py2.py3-none-any.whl', + './thirdLib/xmlschema-1.9.2-py3-none-any.whl', + './thirdLib/acrn_config_tools-3.0-py3-none-any.whl' + ]) + `) + + function test() { + let result = pyodide.runPython(` + import sys + sys.version + `) + console.log(result); + } + + test() + + // pyodide load success + window.pyodide = pyodide; + let t2 = Date.now(); + console.log("Pyodide Load Time: " + (t2 - t1) + "ms") + + let homeDir = await invoke("get_home"); + let pathSplit = "/"; + if (homeDir.indexOf("\\") > 0) { + pathSplit = "\\" + } + + window.systemInfo = { + homeDir, pathSplit + } + + app.mount('#app') +} + +main(); diff --git a/misc/config_tools/configurator/src/main.jsx b/misc/config_tools/configurator/src/main.jsx deleted file mode 100644 index e878a4b86..000000000 --- a/misc/config_tools/configurator/src/main.jsx +++ /dev/null @@ -1,25 +0,0 @@ -import VConsole from 'vconsole'; - -const vConsole = new VConsole(); -import React from 'react' -import ReactDOM from 'react-dom' - -import './index.scss' -import './assets/fonts/Roboto.css' - -import App from './App' -import Navbar from "./components/Navbar"; -import MyErrorBoundary from "./pages/Error/MyErrorBoundary"; -import {Container} from "react-bootstrap"; - -ReactDOM.render( - - - - - - - - , - document.getElementById('root') -) diff --git a/misc/config_tools/configurator/src/pages/Config.vue b/misc/config_tools/configurator/src/pages/Config.vue new file mode 100644 index 000000000..947dbf691 --- /dev/null +++ b/misc/config_tools/configurator/src/pages/Config.vue @@ -0,0 +1,228 @@ + + + + + \ No newline at end of file diff --git a/misc/config_tools/configurator/src/pages/Config/Board.vue b/misc/config_tools/configurator/src/pages/Config/Board.vue new file mode 100644 index 000000000..a4d8d3db0 --- /dev/null +++ b/misc/config_tools/configurator/src/pages/Config/Board.vue @@ -0,0 +1,144 @@ + + + + + \ No newline at end of file diff --git a/misc/config_tools/configurator/src/pages/Config/Config.css b/misc/config_tools/configurator/src/pages/Config/Config.css deleted file mode 100644 index 52c3dbd87..000000000 --- a/misc/config_tools/configurator/src/pages/Config/Config.css +++ /dev/null @@ -1,8 +0,0 @@ -.card, .card-header { - background-color: #F5F5F5; -} - -.configBody { - height: calc(100vh - 80px); - overflow: auto; -} \ No newline at end of file diff --git a/misc/config_tools/configurator/src/pages/Config/Config.jsx b/misc/config_tools/configurator/src/pages/Config/Config.jsx deleted file mode 100644 index 106fdea36..000000000 --- a/misc/config_tools/configurator/src/pages/Config/Config.jsx +++ /dev/null @@ -1,67 +0,0 @@ -import React from "react"; -import {Accordion, Container} from "react-bootstrap"; - -import "./Config.css" - -import Banner from "../../components/Banner"; - -import backArrow from '../../assets/images/back_arrow_icon.svg' - - -// import ExitACRNConfigurationModal from "./ExitACRNConfigurationModal/ExitACRNConfigurationModal"; -import ImportABoardConfigurationFile from "./ImportABoardConfigurationFile"; -import CreateNewOrImportAnExistingScenario from "./CreateNewOrImportAnExistingScenario"; -import ConfigureSettingsForScenario from "./ConfigureSettingsForScenario"; - -import Footer from "../../components/Footer"; -import {ACRNContext} from "../../ACRNContext"; - -class Config extends React.Component { - constructor(props, context) { - super(props); - let {configurator} = context - this.state = { - WorkingFolder: configurator.WorkingFolder - } - } - - render = () => { - return (
    - - -
    - back to welcome page { - document.location.href = '#' - }}/> Working folder: {this.state.WorkingFolder} -
    -
    - - - - - {/**/} - - - - - {/*/!**!/*/} - - - - - {/**/} - - - -
    - -
    ) - }; - - -} - -Config.contextType = ACRNContext - -export default Config diff --git a/misc/config_tools/configurator/src/pages/Config/ConfigForm/ConfigForm.vue b/misc/config_tools/configurator/src/pages/Config/ConfigForm/ConfigForm.vue new file mode 100644 index 000000000..38710d7c6 --- /dev/null +++ b/misc/config_tools/configurator/src/pages/Config/ConfigForm/ConfigForm.vue @@ -0,0 +1,152 @@ + + + + + \ No newline at end of file diff --git a/misc/config_tools/configurator/src/pages/Config/ConfigForm/TabBox.vue b/misc/config_tools/configurator/src/pages/Config/ConfigForm/TabBox.vue new file mode 100644 index 000000000..ff8ac6615 --- /dev/null +++ b/misc/config_tools/configurator/src/pages/Config/ConfigForm/TabBox.vue @@ -0,0 +1,132 @@ + + + + + \ No newline at end of file diff --git a/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigForm/ConfigForm.css b/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigForm/ConfigForm.css deleted file mode 100644 index bd8a5eab6..000000000 --- a/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigForm/ConfigForm.css +++ /dev/null @@ -1,10 +0,0 @@ -.form-area { - mix-blend-mode: normal; - border: 1px solid #373A77; - box-sizing: border-box; - border-radius: 5px; -} - -.object-property-expand { - display: none; -} diff --git a/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigForm/ConfigForm.jsx b/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigForm/ConfigForm.jsx deleted file mode 100644 index 96e7532f9..000000000 --- a/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigForm/ConfigForm.jsx +++ /dev/null @@ -1,150 +0,0 @@ -import React, {Component} from "react" -import Form from "../../../../lib/bs4rjsf" -import {ACRNContext} from "../../../../ACRNContext"; -import SelectWidget from "./IVSHMEM_VM/SelectWidget"; -import TextWidget from "./IVSHMEM_VM/TextWidget"; - -// import CustomTemplateField from "./CustomTemplateField/CustomTemplateField"; - -export class ConfigForm extends Component { - constructor(props) { - super(props); - } - - setFormData = (data) => { - let {configurator} = this.context - let VMID = data['@id'] - - if (VMID == null) { - configurator.programLayer.scenarioData.hv = data - return - } - - let load_order = data['load_order'] - for (let index = 0; index < configurator.programLayer.scenarioData.vm[load_order].length; index++) { - if (configurator.programLayer.scenarioData.vm[load_order][index]['@id'] === VMID) { - configurator.programLayer.scenarioData.vm[load_order][index] = data - } - } - - } - - - getParams = (VMID, mode) => { - let {configurator} = this.context - let schema, formData; - if (VMID === -1) { - schema = configurator.hvSchema[mode] - formData = configurator.programLayer.scenarioData.hv - } else { - let VMData = null; - configurator.programLayer.getOriginScenarioData().vm.map((vmConfig) => { - if (vmConfig['@id'] === VMID) { - VMData = vmConfig - } - }) - schema = configurator.vmSchemas[VMData.load_order][mode] - formData = VMData - } - - return {schema, formData} - } - - - render = () => { - let VMID = this.props.VMID - let mode = this.props.mode - - let params = this.getParams(VMID, mode) - let uiSchema = { - basic: { - DEBUG_OPTIONS: { - BUILD_TYPE: { - "ui:widget": "radio" - } - }, - FEATURES: { - IVSHMEM: { - IVSHMEM_REGION: { - items: { - IVSHMEM_VMS: { - IVSHMEM_VM: { - "ui:style": { - border: "1px solid gray", - padding: "1rem", - borderRadius: "7px" - }, - items: { - VM_NAME: { - "ui:grid": 7, - "ui:widget": 'VM_NAME', - "ui:descLabel": true, - "ui:descLabelAli": 'H', - "ui:descLabelMT": true - }, - VBDF: { - "ui:grid": 5, - "ui:widget": 'VBDF', - "ui:descLabel": true, - "ui:descLabelAli": 'V', - } - } - } - } - } - } - } - }, - vuart_connections: { - vuart_connection: { - items: { - endpoint: { - items: { - vm_name: { - "ui:grid": 6, - "ui:widget": 'VBDF', - "ui:descLabel": true, - "ui:descLabelAli": 'V', - }, - io_port: { - "ui:grid": 6, - "ui:widget": 'VBDF', - "ui:descLabel": true, - "ui:descLabelAli": 'V', - }, - } - } - } - } - } - }, - additionalProperties: { - "ui:widget": "hidden" - } - } - - let widgets = { - VM_NAME: SelectWidget, - VBDF: TextWidget - } - - - return
    -

    * are required fields

    -
    { - let data = e.formData - this.setFormData(data) - }} - /> -
    - } -} - -ConfigForm.contextType = ACRNContext \ No newline at end of file diff --git a/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigForm/CustomTemplateField/CustomTemplateField.js b/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigForm/CustomTemplateField/CustomTemplateField.js deleted file mode 100644 index 5eea0cd9f..000000000 --- a/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigForm/CustomTemplateField/CustomTemplateField.js +++ /dev/null @@ -1,30 +0,0 @@ -import React from "react"; -import Form from "react-bootstrap/Form"; -import ListGroup from "react-bootstrap/ListGroup"; -import WrapIfAdditional from "./WrapIfAdditional"; -// @ts-ignore -import rst2html from "rst2html"; -import { OverlayTrigger, Popover } from "react-bootstrap"; -import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import { faCircleExclamation } from "@fortawesome/free-solid-svg-icons"; -const CustomTemplateField = ({ id, children, displayLabel, rawErrors = [], rawHelp, rawDescription, classNames, disabled, label, onDropPropertyClick, onKeyChange, readonly, required, schema }) => { - let descHtml = ""; - if (rawDescription) { - descHtml = rst2html(rawDescription); - } - return (React.createElement(WrapIfAdditional, { classNames: classNames, disabled: disabled, id: id, label: label, onDropPropertyClick: onDropPropertyClick, onKeyChange: onKeyChange, readonly: readonly, required: required, schema: schema }, - React.createElement(Form.Group, null, - displayLabel && rawDescription && (React.createElement(OverlayTrigger, { trigger: ["hover", "focus"], key: "top", placement: "top", overlay: React.createElement(Popover, { id: `popover-positioned-top` }, - React.createElement(Popover.Body, null, - React.createElement(Form.Text, { className: rawErrors.length > 0 ? "text-danger" : "text-muted", dangerouslySetInnerHTML: { __html: descHtml } }))) }, - React.createElement("span", null, - React.createElement(FontAwesomeIcon, { icon: faCircleExclamation, color: rawErrors.length > 0 ? "red" : "gray" })))), - children, - rawErrors.length > 0 && (React.createElement(ListGroup, { as: "ul" }, rawErrors.map((error) => { - return (React.createElement(ListGroup.Item, { as: "li", key: error, className: "border-0 m-0 p-0" }, - React.createElement("small", { className: "m-0 text-danger" }, error))); - }))), - rawHelp && (React.createElement(Form.Text, { className: rawErrors.length > 0 ? "text-danger" : "text-muted", id: id }, rawHelp))))); -}; -export default CustomTemplateField; -//# sourceMappingURL=CustomTemplateField.js.map \ No newline at end of file diff --git a/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigForm/CustomTemplateField/CustomTemplateField.js.map b/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigForm/CustomTemplateField/CustomTemplateField.js.map deleted file mode 100644 index dc6dce9de..000000000 --- a/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigForm/CustomTemplateField/CustomTemplateField.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"CustomTemplateField.js","sourceRoot":"","sources":["CustomTemplateField.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,OAAO,IAAI,MAAM,sBAAsB,CAAC;AACxC,OAAO,SAAS,MAAM,2BAA2B,CAAC;AAClD,OAAO,gBAAgB,MAAM,oBAAoB,CAAA;AACjD,aAAa;AACb,OAAO,QAAQ,MAAM,UAAU,CAAA;AAC/B,OAAO,EAAC,cAAc,EAAE,OAAO,EAAC,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAC,eAAe,EAAC,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EAAC,mBAAmB,EAAC,MAAM,mCAAmC,CAAC;AAEtE,MAAM,mBAAmB,GAAG,CACxB,EACI,EAAE,EACF,QAAQ,EACR,YAAY,EACZ,SAAS,GAAG,EAAE,EACd,OAAO,EACP,cAAc,EACd,UAAU,EACV,QAAQ,EACR,KAAK,EACL,mBAAmB,EACnB,WAAW,EACX,QAAQ,EACR,QAAQ,EACR,MAAM,EACW,EAAE,EAAE;IAEzB,IAAI,QAAQ,GAAG,EAAE,CAAA;IACjB,IAAI,cAAc,EAAE;QAChB,QAAQ,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAC;KACvC;IAED,OAAO,CACH,oBAAC,gBAAgB,IACb,UAAU,EAAE,UAAU,EACtB,QAAQ,EAAE,QAAQ,EAClB,EAAE,EAAE,EAAE,EACN,KAAK,EAAE,KAAK,EACZ,mBAAmB,EAAE,mBAAmB,EACxC,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM;QAEd,oBAAC,IAAI,CAAC,KAAK;YACN,YAAY,IAAI,cAAc,IAAI,CAC/B,oBAAC,cAAc,IACX,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,EAC3B,GAAG,EAAC,KAAK,EACT,SAAS,EAAC,KAAK,EACf,OAAO,EACH,oBAAC,OAAO,IAAC,EAAE,EAAE,wBAAwB;oBACjC,oBAAC,OAAO,CAAC,IAAI;wBACT,oBAAC,IAAI,CAAC,IAAI,IAAC,SAAS,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY,EAC9D,uBAAuB,EAAE,EAAC,MAAM,EAAE,QAAQ,EAAC,GAAG,CAC9C,CACT;gBAEd;oBACI,oBAAC,eAAe,IACZ,IAAI,EAAE,mBAAmB,EACzB,KAAK,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,GAC9C,CACC,CACM,CACpB;YACA,QAAQ;YACR,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,CACrB,oBAAC,SAAS,IAAC,EAAE,EAAC,IAAI,IACb,SAAS,CAAC,GAAG,CAAC,CAAC,KAAa,EAAE,EAAE;gBAC7B,OAAO,CACH,oBAAC,SAAS,CAAC,IAAI,IAAC,EAAE,EAAC,IAAI,EAAC,GAAG,EAAE,KAAK,EAAE,SAAS,EAAC,kBAAkB;oBAC5D,+BAAO,SAAS,EAAC,iBAAiB,IAC7B,KAAK,CACF,CACK,CACpB,CAAC;YACN,CAAC,CAAC,CACM,CACf;YACA,OAAO,IAAI,CACR,oBAAC,IAAI,CAAC,IAAI,IACN,SAAS,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY,EAC9D,EAAE,EAAE,EAAE,IACL,OAAO,CACA,CACf,CACQ,CACE,CACtB,CAAC;AACN,CAAC,CAAC;AAEF,eAAe,mBAAmB,CAAC"} \ No newline at end of file diff --git a/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigForm/CustomTemplateField/CustomTemplateField.tsx b/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigForm/CustomTemplateField/CustomTemplateField.tsx deleted file mode 100644 index dc404e39c..000000000 --- a/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigForm/CustomTemplateField/CustomTemplateField.tsx +++ /dev/null @@ -1,97 +0,0 @@ -import React from "react"; - -import {FieldTemplateProps} from "@rjsf/core"; - -import Form from "react-bootstrap/Form"; -import ListGroup from "react-bootstrap/ListGroup"; -import WrapIfAdditional from "./WrapIfAdditional" -// @ts-ignore -import rst2html from "rst2html" -import {OverlayTrigger, Popover} from "react-bootstrap"; -import {FontAwesomeIcon} from "@fortawesome/react-fontawesome"; -import {faCircleExclamation} from "@fortawesome/free-solid-svg-icons"; - -const CustomTemplateField = ( - { - id, - children, - displayLabel, - rawErrors = [], - rawHelp, - rawDescription, - classNames, - disabled, - label, - onDropPropertyClick, - onKeyChange, - readonly, - required, - schema - }: FieldTemplateProps) => { - - let descHtml = "" - if (rawDescription) { - descHtml = rst2html(rawDescription); - } - - return ( - - - {displayLabel && rawDescription && ( - - - 0 ? "text-danger" : "text-muted"} - dangerouslySetInnerHTML={{__html: descHtml}}/> - - - }> - - 0 ? "red" : "gray"} - /> - - - )} - {children} - {rawErrors.length > 0 && ( - - {rawErrors.map((error: string) => { - return ( - - - {error} - - - ); - })} - - )} - {rawHelp && ( - 0 ? "text-danger" : "text-muted"} - id={id}> - {rawHelp} - - )} - - - ); -}; - -export default CustomTemplateField; diff --git a/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigForm/CustomTemplateField/WrapIfAdditional.js b/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigForm/CustomTemplateField/WrapIfAdditional.js deleted file mode 100644 index 1845c5985..000000000 --- a/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigForm/CustomTemplateField/WrapIfAdditional.js +++ /dev/null @@ -1,30 +0,0 @@ -import React from "react"; -import { utils } from "@rjsf/core"; -import Row from "react-bootstrap/Row"; -import Col from "react-bootstrap/Col"; -import Form from "react-bootstrap/Form"; -import IconButton from "@rjsf/bootstrap-4"; -const { ADDITIONAL_PROPERTY_FLAG } = utils; -const WrapIfAdditional = ({ children, disabled, id, label, onDropPropertyClick, onKeyChange, readonly, required, schema, }) => { - const keyLabel = `${label} Key`; // i18n ? - const additional = schema.hasOwnProperty(ADDITIONAL_PROPERTY_FLAG); - if (!additional) { - return children; - } - const handleBlur = ({ target }) => onKeyChange(target.value); - // @ts-ignore - return (React.createElement(Row, { key: `${id}-key` }, - React.createElement(Col, { xs: 5 }, - React.createElement(Form.Group, null, - React.createElement(Form.Label, null, keyLabel), - React.createElement(Form.Control, { required: required, defaultValue: label, disabled: disabled || readonly, id: `${id}-key`, name: `${id}-key`, onBlur: !readonly ? handleBlur : undefined, type: "text" }))), - React.createElement(Col, { xs: 5 }, children), - React.createElement(Col, { xs: 2, className: "py-4" }, - React.createElement(IconButton - // @ts-ignore - , { - // @ts-ignore - block: true, className: "w-100", variant: "danger", icon: "remove", tabIndex: -1, disabled: disabled || readonly, onClick: onDropPropertyClick(label) })))); -}; -export default WrapIfAdditional; -//# sourceMappingURL=WrapIfAdditional.js.map \ No newline at end of file diff --git a/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigForm/CustomTemplateField/WrapIfAdditional.js.map b/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigForm/CustomTemplateField/WrapIfAdditional.js.map deleted file mode 100644 index cd823ef9d..000000000 --- a/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigForm/CustomTemplateField/WrapIfAdditional.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"WrapIfAdditional.js","sourceRoot":"","sources":["WrapIfAdditional.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAC,KAAK,EAAC,MAAM,YAAY,CAAC;AAGjC,OAAO,GAAG,MAAM,qBAAqB,CAAC;AACtC,OAAO,GAAG,MAAM,qBAAqB,CAAC;AACtC,OAAO,IAAI,MAAM,sBAAsB,CAAC;AAExC,OAAO,UAAU,MAAM,mBAAmB,CAAC;AAE3C,MAAM,EAAC,wBAAwB,EAAC,GAAG,KAAK,CAAC;AAezC,MAAM,gBAAgB,GAAG,CAAC,EACI,QAAQ,EACR,QAAQ,EACR,EAAE,EACF,KAAK,EACL,mBAAmB,EACnB,WAAW,EACX,QAAQ,EACR,QAAQ,EACR,MAAM,GACc,EAAE,EAAE;IAClD,MAAM,QAAQ,GAAG,GAAG,KAAK,MAAM,CAAC,CAAC,SAAS;IAC1C,MAAM,UAAU,GAAG,MAAM,CAAC,cAAc,CAAC,wBAAwB,CAAC,CAAC;IAEnE,IAAI,CAAC,UAAU,EAAE;QACb,OAAO,QAAQ,CAAC;KACnB;IAED,MAAM,UAAU,GAAG,CAAC,EAAC,MAAM,EAAqC,EAAE,EAAE,CAChE,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAG9B,aAAa;IACb,OAAO,CACH,oBAAC,GAAG,IAAC,GAAG,EAAE,GAAG,EAAE,MAAM;QACjB,oBAAC,GAAG,IAAC,EAAE,EAAE,CAAC;YACN,oBAAC,IAAI,CAAC,KAAK;gBACP,oBAAC,IAAI,CAAC,KAAK,QAAE,QAAQ,CAAc;gBACnC,oBAAC,IAAI,CAAC,OAAO,IACT,QAAQ,EAAE,QAAQ,EAClB,YAAY,EAAE,KAAK,EACnB,QAAQ,EAAE,QAAQ,IAAI,QAAQ,EAC9B,EAAE,EAAE,GAAG,EAAE,MAAM,EACf,IAAI,EAAE,GAAG,EAAE,MAAM,EACjB,MAAM,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,EAC1C,IAAI,EAAC,MAAM,GACb,CACO,CACX;QACN,oBAAC,GAAG,IAAC,EAAE,EAAE,CAAC,IACL,QAAQ,CACP;QACN,oBAAC,GAAG,IAAC,EAAE,EAAE,CAAC,EAAE,SAAS,EAAC,MAAM;YACxB,oBAAC,UAAU;YACP,aAAa;;gBAAb,aAAa;gBACb,KAAK,EAAE,IAAI,EACX,SAAS,EAAC,OAAO,EACjB,OAAO,EAAC,QAAQ,EAChB,IAAI,EAAC,QAAQ,EACb,QAAQ,EAAE,CAAC,CAAC,EACZ,QAAQ,EAAE,QAAQ,IAAI,QAAQ,EAC9B,OAAO,EAAE,mBAAmB,CAAC,KAAK,CAAC,GACrC,CACA,CACJ,CACT,CAAC;AACN,CAAC,CAAC;AAEF,eAAe,gBAAgB,CAAC"} \ No newline at end of file diff --git a/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigForm/CustomTemplateField/WrapIfAdditional.tsx b/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigForm/CustomTemplateField/WrapIfAdditional.tsx deleted file mode 100644 index 56b606bd2..000000000 --- a/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigForm/CustomTemplateField/WrapIfAdditional.tsx +++ /dev/null @@ -1,85 +0,0 @@ -import React from "react"; - -import {utils} from "@rjsf/core"; -import {JSONSchema7} from "json-schema"; - -import Row from "react-bootstrap/Row"; -import Col from "react-bootstrap/Col"; -import Form from "react-bootstrap/Form"; - -import IconButton from "@rjsf/bootstrap-4"; - -const {ADDITIONAL_PROPERTY_FLAG} = utils; - -type WrapIfAdditionalProps = { - children: React.ReactElement; - classNames: string; - disabled: boolean; - id: string; - label: string; - onDropPropertyClick: (index: string) => (event?: any) => void; - onKeyChange: (index: string) => (event?: any) => void; - readonly: boolean; - required: boolean; - schema: JSONSchema7; -}; - -const WrapIfAdditional = ({ - children, - disabled, - id, - label, - onDropPropertyClick, - onKeyChange, - readonly, - required, - schema, - }: WrapIfAdditionalProps) => { - const keyLabel = `${label} Key`; // i18n ? - const additional = schema.hasOwnProperty(ADDITIONAL_PROPERTY_FLAG); - - if (!additional) { - return children; - } - - const handleBlur = ({target}: React.FocusEvent) => - onKeyChange(target.value); - - - // @ts-ignore - return ( - - - - {keyLabel} - - - - - {children} - - - - - - ); -}; - -export default WrapIfAdditional; diff --git a/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigForm/IVSHMEM_VM/SelectWidget/SelectWidget.tsx b/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigForm/IVSHMEM_VM/SelectWidget/SelectWidget.tsx deleted file mode 100644 index 0c5eef43a..000000000 --- a/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigForm/IVSHMEM_VM/SelectWidget/SelectWidget.tsx +++ /dev/null @@ -1,130 +0,0 @@ -import React from "react"; - -import Form from "react-bootstrap/Form"; - -import {WidgetProps} from "@rjsf/core"; -import {utils} from "@rjsf/core"; -import _ from "lodash"; - -const {asNumber, guessType} = utils; - -const nums = new Set(["number", "integer"]); - -/** - * This is a silly limitation in the DOM where option change event values are - * always retrieved as strings. - */ -const processValue = (schema: any, value: any) => { - // "enum" is a reserved word, so only "type" and "items" can be destructured - const {type, items} = schema; - if (value === "") { - return undefined; - } else if (type === "array" && items && nums.has(items.type)) { - return value.map(asNumber); - } else if (type === "boolean") { - return value === "true"; - } else if (type === "number") { - return asNumber(value); - } - - // If type is undefined, but an enum is present, try and infer the type from - // the enum values - if (schema.enum) { - if (schema.enum.every((x: any) => guessType(x) === "number")) { - return asNumber(value); - } else if (schema.enum.every((x: any) => guessType(x) === "boolean")) { - return value === "true"; - } - } - - return value; -}; - -const SelectWidget = ( - { - schema, - id, - options, - label, - required, - disabled, - readonly, - value, - multiple, - autofocus, - onChange, - onBlur, - onFocus, - placeholder, - rawErrors = [], - }: WidgetProps) => { - const {enumOptions, enumDisabled} = options; - - const emptyValue = multiple ? [] : ""; - - function getValue( - event: React.FocusEvent | React.ChangeEvent | any, - multiple: Boolean, - ) { - if (multiple) { - return [].slice - .call(event.target.options as any) - .filter((o: any) => o.selected) - .map((o: any) => o.value); - } else { - return event.target.value; - } - } - - let isFirst = _.endsWith(id, 'IVSHMEM_VM_0_VM_NAME') - return ( - -
    - 0 ? "is-invalid" : "")} - onBlur={ - onBlur && - ((event: React.FocusEvent) => { - const newValue = getValue(event, multiple); - onBlur(id, processValue(schema, newValue)); - }) - } - onFocus={ - onFocus && - ((event: React.FocusEvent) => { - const newValue = getValue(event, multiple); - onFocus(id, processValue(schema, newValue)); - }) - } - onChange={(event: React.ChangeEvent) => { - const newValue = getValue(event, multiple); - onChange(processValue(schema, newValue)); - }}> - {!multiple && schema.default === undefined && ( - - )} - {(enumOptions as any).map(({value, label}: any, i: number) => { - const disabled: any = - Array.isArray(enumDisabled) && - (enumDisabled as any).indexOf(value) != -1; - return ( - - ); - })} - -
    -
    - ); -}; - -export default SelectWidget; diff --git a/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigForm/IVSHMEM_VM/SelectWidget/index.ts b/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigForm/IVSHMEM_VM/SelectWidget/index.ts deleted file mode 100644 index 6e104f2ea..000000000 --- a/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigForm/IVSHMEM_VM/SelectWidget/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export {default} from "./SelectWidget"; -export * from "./SelectWidget"; diff --git a/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigForm/IVSHMEM_VM/TextWidget/TextWidget.tsx b/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigForm/IVSHMEM_VM/TextWidget/TextWidget.tsx deleted file mode 100644 index 23e0ca0e5..000000000 --- a/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigForm/IVSHMEM_VM/TextWidget/TextWidget.tsx +++ /dev/null @@ -1,72 +0,0 @@ -import React from "react"; - -import Form from "react-bootstrap/Form"; - -import {WidgetProps} from "@rjsf/core"; -import _ from "lodash"; - -const TextWidget = ( - { - id, - placeholder, - required, - readonly, - disabled, - type, - label, - value, - onChange, - onBlur, - onFocus, - autofocus, - options, - schema, - rawErrors = [], - uiSchema, - }: WidgetProps) => { - const _onChange = ({ - target: {value}, - }: React.ChangeEvent) => - onChange(value === "" ? options.emptyValue : value); - const _onBlur = ({target: {value}}: React.FocusEvent) => - onBlur(id, value); - const _onFocus = ({ - target: {value}, - }: React.FocusEvent) => onFocus(id, value); - const inputType = (type || schema.type) === "string" ? "text" : `${type || schema.type}`; - - // const classNames = [rawErrors.length > 0 ? "is-invalid" : "", type === 'file' ? 'custom-file-label': ""] - // let isFirst = _.endsWith(id, 'IVSHMEM_VM_0_VBDF') - return ( - -
    - 0 ? "is-invalid" : ""} - list={schema.examples ? `examples_${id}` : undefined} - type={inputType} - value={value || value === 0 ? value : ""} - onChange={_onChange} - onBlur={_onBlur} - onFocus={_onFocus} - /> -
    - {schema.examples ? ( - - {(schema.examples as string[]) - .concat(schema.default ? ([schema.default] as string[]) : []) - .map((example: any) => { - return - ) : null} -
    - ); -}; - -export default TextWidget; diff --git a/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigForm/IVSHMEM_VM/TextWidget/index.ts b/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigForm/IVSHMEM_VM/TextWidget/index.ts deleted file mode 100644 index e7e838908..000000000 --- a/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigForm/IVSHMEM_VM/TextWidget/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export {default} from "./TextWidget"; -export * from "./TextWidget"; diff --git a/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigForm/index.jsx b/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigForm/index.jsx deleted file mode 100644 index d3ebf86f2..000000000 --- a/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigForm/index.jsx +++ /dev/null @@ -1,5 +0,0 @@ -import './ConfigForm.css' -import {ConfigForm} from "./ConfigForm"; - - -export default ConfigForm; \ No newline at end of file diff --git a/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigTabBar/ConfigTabBar.css b/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigTabBar/ConfigTabBar.css deleted file mode 100644 index b59ad88c4..000000000 --- a/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigTabBar/ConfigTabBar.css +++ /dev/null @@ -1,12 +0,0 @@ -.TabBox { - display: flex; - user-select: none; - border: 1px solid #007B81; - box-sizing: border-box; - border-radius: 5px; -} - -.rjsf button[type='submit'] { - display: none; -} - diff --git a/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigTabBar/ConfigTabBar.jsx b/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigTabBar/ConfigTabBar.jsx deleted file mode 100644 index 5ac542d10..000000000 --- a/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigTabBar/ConfigTabBar.jsx +++ /dev/null @@ -1,84 +0,0 @@ -import React, {Component} from "react"; -import "./ConfigTabBar.css" -import Tab from "./Tab"; -import TabSplitter from "./TabSplitter"; -import TabAdd from "./TabAdd"; -import {ACRNContext} from "../../../../ACRNContext"; - -export default class ConfigTabBar extends Component { - constructor(props) { - super(props); - this.state = { - activeVMID: -1 - } - } - - componentDidMount = () => { - let {configurator} = this.context - this.funRegisterID = configurator.programLayer.register( - configurator.eventName.scenarioDataUpdate, () => { - this.forceUpdate() - } - ) - } - - componentWillUnmount = () => { - let {configurator} = this.context - configurator.programLayer.unregister(this.funRegisterID) - } - - active = (activeVMID = null) => { - if (activeVMID == null) { - return this.state.activeVMID - } - this.props.callback ? this.props.callback(activeVMID) : null; - return this.setState({activeVMID: activeVMID}) - } - - tab = (vmConfig, desc) => { - console.log(vmConfig) - return - } - - - render = () => { - let {configurator} = this.context - let scenarioData = configurator.programLayer.scenarioData - - let PRE_LAUNCHED_VM = scenarioData.vm.PRE_LAUNCHED_VM.map((vmConfig) => { - return this.tab(vmConfig, 'Pre-Launched') - }) - let SERVICE_VM = scenarioData.vm.SERVICE_VM.map((vmConfig) => { - return this.tab(vmConfig, 'ServiceVM') - }) - let POST_LAUNCHED_VM = scenarioData.vm.POST_LAUNCHED_VM.map((vmConfig) => { - return this.tab(vmConfig, 'Post-Launched') - }) - - return ( -
    - - - {PRE_LAUNCHED_VM} - { - configurator.programLayer.addVM('PRE_LAUNCHED_VM') - }}/> - {SERVICE_VM} - {POST_LAUNCHED_VM} - { - if (scenarioData.vm.SERVICE_VM.length === 0) { - configurator.programLayer.addVM('SERVICE_VM') - } - configurator.programLayer.addVM('POST_LAUNCHED_VM') - }}/> -
    - ) - } -} -ConfigTabBar.contextType = ACRNContext \ No newline at end of file diff --git a/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigTabBar/Tab/Tab.css b/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigTabBar/Tab/Tab.css deleted file mode 100644 index e22c4815b..000000000 --- a/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigTabBar/Tab/Tab.css +++ /dev/null @@ -1,17 +0,0 @@ -div.TabBox{ - overflow-x: auto; -} -.TabBox .Tab { - background: #E1F2EF; - border-radius: 5px; - color: #007B81; - border: 1px solid #007B81; - margin: 0 0.5rem 0 0; - cursor: pointer; - white-space: nowrap; -} - -.TabBox .Tab.Active { - background: #373A77; - color: white; -} diff --git a/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigTabBar/Tab/Tab.jsx b/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigTabBar/Tab/Tab.jsx deleted file mode 100644 index 58ee1a84e..000000000 --- a/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigTabBar/Tab/Tab.jsx +++ /dev/null @@ -1,22 +0,0 @@ -import React, {Component} from "react"; -import './Tab.css' - -export default class Tab extends Component { - constructor(props) { - super(props); - } - - setActive = () => { - this.props.active(this.props.VMID) - } - - render() { - let active = this.props.active() === this.props.VMID ? "Active" : '' - return ( -
    -
    {this.props.title}
    -
    {this.props.desc}
    -
    - ) - } -} \ No newline at end of file diff --git a/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigTabBar/Tab/index.jsx b/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigTabBar/Tab/index.jsx deleted file mode 100644 index d559af4d7..000000000 --- a/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigTabBar/Tab/index.jsx +++ /dev/null @@ -1,3 +0,0 @@ -import Tab from "./Tab"; - -export default Tab \ No newline at end of file diff --git a/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigTabBar/TabAdd/TabAdd.css b/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigTabBar/TabAdd/TabAdd.css deleted file mode 100644 index 0fbb5a74c..000000000 --- a/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigTabBar/TabAdd/TabAdd.css +++ /dev/null @@ -1,4 +0,0 @@ -.TabAdd { - cursor: pointer; - white-space: nowrap; -} \ No newline at end of file diff --git a/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigTabBar/TabAdd/TabAdd.jsx b/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigTabBar/TabAdd/TabAdd.jsx deleted file mode 100644 index 5d6a18b40..000000000 --- a/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigTabBar/TabAdd/TabAdd.jsx +++ /dev/null @@ -1,12 +0,0 @@ -import React, {Component} from "react"; -import addIcon from './assets/Plus.svg' -import './TabAdd.css' - -export default class TabAdd extends Component { - render() { - return (
    -
    {"Add
    -
    {this.props.desc}
    -
    ) - } -} \ No newline at end of file diff --git a/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigTabBar/TabAdd/index.jsx b/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigTabBar/TabAdd/index.jsx deleted file mode 100644 index 17a69f7d8..000000000 --- a/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigTabBar/TabAdd/index.jsx +++ /dev/null @@ -1,3 +0,0 @@ -import TabAdd from "./TabAdd"; - -export default TabAdd \ No newline at end of file diff --git a/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigTabBar/TabSplitter/TabSplitter.css b/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigTabBar/TabSplitter/TabSplitter.css deleted file mode 100644 index a64298309..000000000 --- a/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigTabBar/TabSplitter/TabSplitter.css +++ /dev/null @@ -1,6 +0,0 @@ -.TabSplitter { - height: 74px; - width: 0; - border-right: 1px solid #C4C4C4; - margin: 0 0.5rem; -} diff --git a/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigTabBar/TabSplitter/TabSplitter.jsx b/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigTabBar/TabSplitter/TabSplitter.jsx deleted file mode 100644 index 6751502a8..000000000 --- a/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigTabBar/TabSplitter/TabSplitter.jsx +++ /dev/null @@ -1,10 +0,0 @@ -import {Component} from "react"; -import './TabSplitter.css' - -export default class TabSplitter extends Component { - render() { - return ( -
    {" "}
    - ) - } -} \ No newline at end of file diff --git a/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigTabBar/TabSplitter/index.jsx b/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigTabBar/TabSplitter/index.jsx deleted file mode 100644 index bfc0be382..000000000 --- a/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigTabBar/TabSplitter/index.jsx +++ /dev/null @@ -1,3 +0,0 @@ -import TabSplitter from "./TabSplitter"; - -export default TabSplitter \ No newline at end of file diff --git a/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigTabBar/index.jsx b/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigTabBar/index.jsx deleted file mode 100644 index e69de29bb..000000000 diff --git a/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigureSettingsForScenario.css b/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigureSettingsForScenario.css deleted file mode 100644 index 5abc12ca6..000000000 --- a/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigureSettingsForScenario.css +++ /dev/null @@ -1,55 +0,0 @@ -.nav-tabs .nav-link { - font-family: Roboto, serif; - font-style: normal; - font-weight: 500; - font-size: 22px; - line-height: 26px; - - background: #E1F2EF; - border: 1px solid #007B81; - box-sizing: border-box; - box-shadow: inset 0 -1px 0 #D7D7D7; - border-radius: 5px 5px 0 0; - border-bottom: none; - - color: #007B81; - margin-right: 4px; - padding: 1rem 1.5rem; -} - -.nav-tabs .nav-link.active { - mix-blend-mode: normal; - border: 1px solid #373A77; - border-bottom: none; - box-sizing: border-box; - border-radius: 5px 5px 0 0; - - - font-weight: 600; - - color: #373A77; -} - -.nav-tabs .nav-link.active:after { - display: block; - content: ""; - height: 3px; - background: white; - position: relative; - top: calc(1rem + 1px); - left: -1.5rem; - width: calc(100% + 3rem + 1px); -} - -.tab-content { - margin-top: -2px; -} -.nav-tabs{ - border-bottom: none; -} - -.deleteVM { - height: 52px; - max-width: 210px; - width: 100%; -} \ No newline at end of file diff --git a/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigureSettingsForScenario.jsx b/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigureSettingsForScenario.jsx deleted file mode 100644 index d9539704f..000000000 --- a/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/ConfigureSettingsForScenario.jsx +++ /dev/null @@ -1,108 +0,0 @@ -import React, {Component} from "react"; -import "./ConfigureSettingsForScenario.css" -import {Accordion, Button} from "react-bootstrap"; -import {FontAwesomeIcon} from "@fortawesome/react-fontawesome"; -import {faMinus} from "@fortawesome/free-solid-svg-icons"; -import ConfigTabBar from "./ConfigTabBar/ConfigTabBar"; -import ConfigForm from "./ConfigForm"; -import {ACRNContext} from "../../../ACRNContext"; - -export default class ConfigureSettingsForScenario extends Component { - constructor(props) { - super(props); - // VMID possible value - // [-1 0 1 2 3] - this.state = { - VMID: -1, - tabMode: 'basic' - } - } - - tabSwitch = (VMID) => { - this.setState({VMID: VMID}) - document.querySelector('#BasicFormTab').click() - this.forceUpdate() - } - - tab = (tabID, title, isActive) => { - let active = isActive ? 'active' : '' - return ( -
  • - -
  • - ) - } - - tabsContent = (mode, VMID) => { - let tabID = mode + 'Form' - - return (
    - -
    ) - } - - render = () => { - let {configurator} = this.context - let scenarioData = configurator.programLayer.scenarioData - return ( - -
    -
    3. Configure settings for scenario and launch scripts
    - -
    -
    - - -
    - -
    -
    -
    -
      - {this.tab('BasicForm', 'Basic Parameters', true)} - {this.tab('AdvancedForm', 'Advanced Parameters', false)} -
    - -
    -
    - {this.tabsContent('Basic', this.state.VMID)} - {this.tabsContent('Advanced', this.state.VMID)} -
    - -
    -
    -
    ) - } -} -ConfigureSettingsForScenario.contextType = ACRNContext \ No newline at end of file diff --git a/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/index.jsx b/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/index.jsx deleted file mode 100644 index 42a2b4174..000000000 --- a/misc/config_tools/configurator/src/pages/Config/ConfigureSettingsForScenario/index.jsx +++ /dev/null @@ -1,3 +0,0 @@ -import ConfigureSettingsForScenario from "./ConfigureSettingsForScenario"; - -export default ConfigureSettingsForScenario \ No newline at end of file diff --git a/misc/config_tools/configurator/src/pages/Config/CreateNewOrImportAnExistingScenario/CreateNewOrImportAnExistingScenario.jsx b/misc/config_tools/configurator/src/pages/Config/CreateNewOrImportAnExistingScenario/CreateNewOrImportAnExistingScenario.jsx deleted file mode 100644 index b020ff2c4..000000000 --- a/misc/config_tools/configurator/src/pages/Config/CreateNewOrImportAnExistingScenario/CreateNewOrImportAnExistingScenario.jsx +++ /dev/null @@ -1,158 +0,0 @@ -import React, {Component} from "react"; -import {Accordion, Button, Col, Form, Row} from "react-bootstrap"; - -import CreateScenarioModal from "./CreateScenarioModal/CreateScenarioModal"; -import {dialog} from "@tauri-apps/api"; -import {ACRNContext} from "../../../ACRNContext"; -import {invoke} from "@tauri-apps/api/tauri"; -import _ from "lodash/fp"; - -export default class CreateNewOrImportAnExistingScenario extends Component { - constructor(props) { - super(props); - this.scenarioXMLSelect = React.createRef() - this.scenarioXMLFileInput = React.createRef() - this.state = { - scenarioConfigFiles: [], - stage: props.stage, - scenarioName: '', - scenarioConfig: {}, - selected: null - } - } - - componentDidMount() { - let {configurator} = this.context - this.scenarioHistoryUpdate() - invoke('fs_read_dir', { - path: configurator.WorkingFolder, - recursive: false - }).then((files) => { - for (let i = 0; i < files.length; i++) { - let isScenario = _.endsWith("/scenario.xml", files[i].path.replace(/\\/g, '/')); - console.log("files", isScenario, files[i].path) - if (isScenario) { - this.scenarioChange(files[i].path).then(() => { - this.importScenario() - }) - } - } - }) - } - - scenarioHistoryUpdate() { - let {configurator} = this.context - return configurator.getHistory('scenario').then((scenarioHistory) => { - this.setState({scenarioConfigFiles: scenarioHistory}) - }) - } - - - openFileDialog = () => { - dialog.open({directory: false, multiple: false}).then(this.scenarioChange) - } - - scenarioChange = (filepath) => { - console.log(filepath) - let {configurator} = this.context - return configurator.addHistory('scenario', filepath).then(() => { - this.scenarioHistoryUpdate().then(() => { - this.scenarioXMLSelect.current.value = filepath - }) - }) - } - - importScenario = () => { - let {configurator} = this.context - return configurator.programLayer.loadScenario(this.scenarioXMLSelect.current.value) - .then(() => { - this.setState({selected: this.getScenarioPath()}) - }).then(() => { - let tabButton = document.querySelectorAll(".accordion-button")[2]; - if (tabButton.className.indexOf('collapsed') >= 0) { - tabButton.click() - } - }) - .catch((reason) => { - console.log(reason) - alert(reason) - }) - }; - - getScenarioPath = () => { - let {configurator} = this.context - let printPath = configurator.WorkingFolder; - if (_.endsWith("/", configurator.WorkingFolder) || _.endsWith("\\", configurator.WorkingFolder)) { - printPath = printPath + 'scenario.xml' - } else { - printPath = printPath + (configurator.WorkingFolder[1] === ":" ? "\\" : '/') + 'scenario.xml' - } - return printPath; - } - - render = () => { - let {configurator} = this.context - let scenarioHistorySelect = this.state.scenarioConfigFiles.map((optionValue, index) => { - return () - }) - return ( - - -
    - 2. Create new or import an existing scenario -
    -
    - - - -

    Current scenario: - {this.state.selected ? this.state.selected : "none selected"}

    -
    - { - this.setState({selected: this.getScenarioPath()}) - }}/> -
    - - - - - - Recently used scenarios: - - - - - - - - - - - -
    - - {scenarioHistorySelect} - - - - - Browse for scenario file… - -
    -
    - -
    -
    -
    - - -
    -
    -
    - ) - } -} -CreateNewOrImportAnExistingScenario.contextType = ACRNContext \ No newline at end of file diff --git a/misc/config_tools/configurator/src/pages/Config/CreateNewOrImportAnExistingScenario/CreateScenarioModal/CreateScenarioModal.css b/misc/config_tools/configurator/src/pages/Config/CreateNewOrImportAnExistingScenario/CreateScenarioModal/CreateScenarioModal.css deleted file mode 100644 index 27786294e..000000000 --- a/misc/config_tools/configurator/src/pages/Config/CreateNewOrImportAnExistingScenario/CreateScenarioModal/CreateScenarioModal.css +++ /dev/null @@ -1,17 +0,0 @@ -.vmNum input[type="number"] { - max-width: 69px; - text-align: center; -} -.vmNum b{ - padding: 0 0; -} - -.vmNum b, .vmNum input { - flex: 0 1 50%; -} - -.modal-header .btn-close{ - margin-right: 15px; - color: white; - font-weight: bolder; -} \ No newline at end of file diff --git a/misc/config_tools/configurator/src/pages/Config/CreateNewOrImportAnExistingScenario/CreateScenarioModal/CreateScenarioModal.jsx b/misc/config_tools/configurator/src/pages/Config/CreateNewOrImportAnExistingScenario/CreateScenarioModal/CreateScenarioModal.jsx deleted file mode 100644 index bd9438fc7..000000000 --- a/misc/config_tools/configurator/src/pages/Config/CreateNewOrImportAnExistingScenario/CreateScenarioModal/CreateScenarioModal.jsx +++ /dev/null @@ -1,128 +0,0 @@ -import {Button, Form, Modal} from "react-bootstrap"; -import {Component} from "react"; -import "./CreateScenarioModal.css" -import {ACRNContext} from "../../../../ACRNContext"; - -export default class CreateScenarioModal extends Component { - constructor(props) { - super(props); - this.state = { - show: false, - mode: 'POST_LAUNCHED_VM' - } - } - - - handelScenarioCreateEvent = () => { - function getVal(id) { - // @ts-ignore - return document.querySelector('#' + id + 'Inp').value - } - - function getInt(id) { - return parseInt(getVal(id)) - } - - const vmNum = { - PRE_LAUNCHED_VM: this.state.mode === 'POST_LAUNCHED_VM' ? 0 : getInt('PRE_LAUNCHED_VM'), - SERVICE_VM: this.state.mode === 'PRE_LAUNCHED_VM' ? 0 : getInt('SERVICE_VM'), - POST_LAUNCHED_VM: this.state.mode === 'PRE_LAUNCHED_VM' ? 0 : getInt('POST_LAUNCHED_VM'), - } - let {configurator} = this.context - - configurator.programLayer.newScenario(vmNum.PRE_LAUNCHED_VM, vmNum.SERVICE_VM, vmNum.POST_LAUNCHED_VM) - this.props.cb() - this.setState({show: false}) - } - - - render = () => { - - const handleClose = () => this.setState({show: false}); - const handleShow = () => this.setState({show: true}); - const handleScenarioModeChange = (event) => this.setState({mode: event.target.id}) - - return ( - <> - - - - - Create a new Scenario - - -
    -
    -
    -

    - Choose a scenario type: - - Learn about scenarios - -

    - Shared (Post-launched VMs only)} - defaultChecked={this.state.mode === 'POST_LAUNCHED_VM'} - /> - - Partitioned (Pre-launched VMs only)} - defaultChecked={this.state.mode === 'PRE_LAUNCHED_VM'} - /> - - Hybrid (Both pre-launched and post-launched VMs)} - defaultChecked={this.state.mode === 'hybrid'} - /> -
    - VM Configuration -

    This system’s board supports a maximum of 8 VMs.

    -

    How many of each VM type do you want in your scenario? (You can change these - later.)

    -
    - Pre-launch - VMs: - - Service VM: - - Post-launch - VMs: - -
    -
    -
    -
    - - - - -
    - - ) - } -} - -CreateScenarioModal.contextType = ACRNContext \ No newline at end of file diff --git a/misc/config_tools/configurator/src/pages/Config/CreateNewOrImportAnExistingScenario/CreateScenarioModal/index.jsx b/misc/config_tools/configurator/src/pages/Config/CreateNewOrImportAnExistingScenario/CreateScenarioModal/index.jsx deleted file mode 100644 index f70751faf..000000000 --- a/misc/config_tools/configurator/src/pages/Config/CreateNewOrImportAnExistingScenario/CreateScenarioModal/index.jsx +++ /dev/null @@ -1,3 +0,0 @@ -import CreateScenarioModal from "./CreateScenarioModal"; - -export default CreateScenarioModal \ No newline at end of file diff --git a/misc/config_tools/configurator/src/pages/Config/CreateNewOrImportAnExistingScenario/index.jsx b/misc/config_tools/configurator/src/pages/Config/CreateNewOrImportAnExistingScenario/index.jsx deleted file mode 100644 index 9a5af579d..000000000 --- a/misc/config_tools/configurator/src/pages/Config/CreateNewOrImportAnExistingScenario/index.jsx +++ /dev/null @@ -1,3 +0,0 @@ -import CreateNewOrImportAnExistingScenario from "./CreateNewOrImportAnExistingScenario"; - -export default CreateNewOrImportAnExistingScenario \ No newline at end of file diff --git a/misc/config_tools/configurator/src/pages/Config/ExitACRNConfigurationModal/ExitACRNConfigurationModal.jsx b/misc/config_tools/configurator/src/pages/Config/ExitACRNConfigurationModal/ExitACRNConfigurationModal.jsx deleted file mode 100644 index 84792f416..000000000 --- a/misc/config_tools/configurator/src/pages/Config/ExitACRNConfigurationModal/ExitACRNConfigurationModal.jsx +++ /dev/null @@ -1,63 +0,0 @@ -import {CloseButton, Button, Modal} from "react-bootstrap"; -import {Component, useState} from "react"; -import {ACRNContext} from "../../../ACRNContext"; - -export default class ExitACRNConfigurationModal extends Component { - constructor(props) { - super(props); - this.state = { - show: false - } - } - - render() { - let {configurator} = this.context - - const handleClose = () => this.setState({show: false}); - const handleShow = (e) => { - this.setState({show: true}) - e.preventDefault() - } - - return ( - <> - - - - - Exit ACRN Configuration - - -
    - ACRN Configuration files will be saved in the working folder: -

    - {configurator.WorkingFolder} -

    -
    -
    - - - - - -
    - - ); - } -} -ExitACRNConfigurationModal.contextType = ACRNContext diff --git a/misc/config_tools/configurator/src/pages/Config/ImportABoardConfigurationFile/ImportABoardConfigurationFile.jsx b/misc/config_tools/configurator/src/pages/Config/ImportABoardConfigurationFile/ImportABoardConfigurationFile.jsx deleted file mode 100644 index 5548f63f8..000000000 --- a/misc/config_tools/configurator/src/pages/Config/ImportABoardConfigurationFile/ImportABoardConfigurationFile.jsx +++ /dev/null @@ -1,179 +0,0 @@ -import React, {Component} from "react"; -import {Accordion, Button, Col, Form, Row} from "react-bootstrap"; -import {dialog} from "@tauri-apps/api"; -import {ACRNContext} from "../../../ACRNContext"; -import {invoke} from "@tauri-apps/api/tauri"; -import _ from "lodash/fp"; - -export default class ImportABoardConfigurationFile extends Component { - constructor(props) { - super(props); - this.boardXMLSelect = React.createRef() - this.boardXMLFileInput = React.createRef() - this.state = { - disableImport: true, - boardFiles: [], - boardName: '', - boardXML: '', - BIOS_INFO: '', - BASE_BOARD_INFO: '' - } - } - - componentDidMount = () => { - let {configurator} = this.context - configurator.getHistory('board').then((boardFiles) => { - let disableImport = boardFiles.length === 0 - this.setState({boardFiles, disableImport}) - }) - invoke('fs_read_dir', { - path: configurator.WorkingFolder, - recursive: false - }).then((files) => { - for (let i = 0; i < files.length; i++) { - console.log("files", files[i].path) - if (_.endsWith(".board.xml", files[i].path)) { - this.boardChange(files[i].path).then(() => { - this.importBoard() - }) - } - } - }) - } - - - openFileDialog = () => { - //this.boardXMLFileInput.current.click() - dialog.open({directory: false, multiple: false}).then((filepath) => { - this.boardChange(filepath) - }) - }; - - boardChange = (filepath) => { - let {configurator} = this.context - return configurator.addHistory('board', filepath).then(() => { - return configurator.getHistory('board') - }).then((boardFiles) => { - console.log(boardFiles) - this.setState({ - disableImport: false, - boardFiles - }) - }).then(() => { - this.boardXMLSelect.current.value = filepath - }) - } - - importBoard = () => { - let {configurator} = this.context - - if (!this.state.boardXML) { - configurator.loadBoard(this.boardXMLSelect.current.value, this.updateBoardInfo) - } else { - this.openFileDialog() - } - } - - getNodeTextContent(boardXML, nodeSelector) { - return boardXML.querySelector(nodeSelector).textContent; - } - - updateBoardInfo = (boardName, boardXMLText) => { - const boardXML = (new DOMParser()).parseFromString(boardXMLText, 'text/xml') - let BIOS_INFO = this.getNodeTextContent(boardXML, "BIOS_INFO").replace(/\s+BIOS Information\s+/, '') - let BASE_BOARD_INFO = this.getNodeTextContent(boardXML, "BASE_BOARD_INFO").replace(/\s+Base Board Information\s+/, '') - this.setState({ - boardName: boardName, - boardXML: boardXML, - BIOS_INFO: BIOS_INFO, - BASE_BOARD_INFO: BASE_BOARD_INFO - }) - this.boardXMLSelect.current.disabled = true - } - - render() { - let boardHistorySelect = this.state.boardFiles.map((optionValue, index) => { - return ( - - ) - }) - return ( - - -
    - 1. Import a board configuration file -
    -
    - - - - - -
    - - {this.state.boardXML ? 'Current board file:' : 'Recently used board files:'} - - - - - - - - - - - -
    - - {boardHistorySelect} - - - - - Browse for file… - -
    -
    - -
    -
    -
    - - -
    - - - - -
    -
    - {this.state.boardXML ? "Current Board: " + this.state.boardName : "No board information has been imported yet."} -
    -
    -
    - - - {this.state.BASE_BOARD_INFO} - - - {this.state.BIOS_INFO} - - -
    -
    -
    - -
    -
    -
    - ) - } -} -ImportABoardConfigurationFile.contextType = ACRNContext \ No newline at end of file diff --git a/misc/config_tools/configurator/src/pages/Config/ImportABoardConfigurationFile/index.jsx b/misc/config_tools/configurator/src/pages/Config/ImportABoardConfigurationFile/index.jsx deleted file mode 100644 index 57c43eeea..000000000 --- a/misc/config_tools/configurator/src/pages/Config/ImportABoardConfigurationFile/index.jsx +++ /dev/null @@ -1,3 +0,0 @@ -import ImportABoardConfigurationFile from "./ImportABoardConfigurationFile"; - -export default ImportABoardConfigurationFile \ No newline at end of file diff --git a/misc/config_tools/configurator/src/pages/Config/Scenario.vue b/misc/config_tools/configurator/src/pages/Config/Scenario.vue new file mode 100644 index 000000000..3b0942bd9 --- /dev/null +++ b/misc/config_tools/configurator/src/pages/Config/Scenario.vue @@ -0,0 +1,112 @@ + + + + + \ No newline at end of file diff --git a/misc/config_tools/configurator/src/pages/Config/Scenario/NewScenario.vue b/misc/config_tools/configurator/src/pages/Config/Scenario/NewScenario.vue new file mode 100644 index 000000000..c5f2342b2 --- /dev/null +++ b/misc/config_tools/configurator/src/pages/Config/Scenario/NewScenario.vue @@ -0,0 +1,131 @@ + + + + + \ No newline at end of file diff --git a/misc/config_tools/configurator/src/pages/Error/Error.jsx b/misc/config_tools/configurator/src/pages/Error/Error.jsx deleted file mode 100644 index 19763d6f4..000000000 --- a/misc/config_tools/configurator/src/pages/Error/Error.jsx +++ /dev/null @@ -1,15 +0,0 @@ -import React from 'react'; - -export class Error extends React.Component { - render() { - return ( -
    - There's nothing here!
    - Your URL: {document.location.href} -
    - ); - } -} - - -export default Error; \ No newline at end of file diff --git a/misc/config_tools/configurator/src/pages/Error/MyErrorBoundary.jsx b/misc/config_tools/configurator/src/pages/Error/MyErrorBoundary.jsx deleted file mode 100644 index e0bf6c260..000000000 --- a/misc/config_tools/configurator/src/pages/Error/MyErrorBoundary.jsx +++ /dev/null @@ -1,23 +0,0 @@ -import {Component} from "react"; - -export default class MyErrorBoundary extends Component { - state = { - hasError: false, - }; - - static getDerivedStateFromError(error) { - return {hasError: true}; - }; - - componentDidCatch(error, errorInfo) { - // A custom error logging function - console.log(error, errorInfo); - }; - - render() { - return this.state.hasError ? <> - Error detect, you can see error log in vconsole at right bottom. - Please report error log to me, https://github.com/Weiyi-Feng/acrn-hypervisor/issue . - : this.props.children; - } -} \ No newline at end of file diff --git a/misc/config_tools/configurator/src/pages/Welcome.vue b/misc/config_tools/configurator/src/pages/Welcome.vue new file mode 100644 index 000000000..2a86285ce --- /dev/null +++ b/misc/config_tools/configurator/src/pages/Welcome.vue @@ -0,0 +1,43 @@ + + + + + \ No newline at end of file diff --git a/misc/config_tools/configurator/src/pages/Welcome/ExitACRNConfigurationModal/ExitACRNConfigurationModal.jsx b/misc/config_tools/configurator/src/pages/Welcome/ExitACRNConfigurationModal/ExitACRNConfigurationModal.jsx deleted file mode 100644 index 25ceb1654..000000000 --- a/misc/config_tools/configurator/src/pages/Welcome/ExitACRNConfigurationModal/ExitACRNConfigurationModal.jsx +++ /dev/null @@ -1,41 +0,0 @@ -import {CloseButton, Button, Modal} from "react-bootstrap"; -import {useState} from "react"; - -export default function ExitACRNConfigurationModal(props) { - const [show, setShow] = useState(false); - - const handleClose = () => setShow(false); - const handleShow = (e) => { - setShow(true); - e.preventDefault() - } - - return ( - <> - - - - - Exit ACRN Configuration - - -
    - Do you want exit ACRN Configuration? -
    -
    - - - - -
    - - ); -} - diff --git a/misc/config_tools/configurator/src/pages/Welcome/NewConfiguration.vue b/misc/config_tools/configurator/src/pages/Welcome/NewConfiguration.vue new file mode 100644 index 000000000..d593799eb --- /dev/null +++ b/misc/config_tools/configurator/src/pages/Welcome/NewConfiguration.vue @@ -0,0 +1,104 @@ + + + + + \ No newline at end of file diff --git a/misc/config_tools/configurator/src/pages/Welcome/StartNewConfigurationPanel/StartNewConfigurationPanel.jsx b/misc/config_tools/configurator/src/pages/Welcome/StartNewConfigurationPanel/StartNewConfigurationPanel.jsx deleted file mode 100644 index f50b6618d..000000000 --- a/misc/config_tools/configurator/src/pages/Welcome/StartNewConfigurationPanel/StartNewConfigurationPanel.jsx +++ /dev/null @@ -1,138 +0,0 @@ -import React from "react"; -import {useNavigate} from "react-router"; -import {Button, Form} from "react-bootstrap"; - -import Confirm from "../../../components/Confirm/Confirm"; -import {dialog, fs} from "@tauri-apps/api"; -import {ACRNContext} from "../../../ACRNContext"; -import {invoke} from "@tauri-apps/api/tauri"; - -class StartNewConfigurationPanel extends React.Component { - constructor(props, context) { - super(props); - const {navigate} = this.props; - this.navigate = navigate - this.pathInput = React.createRef() - - this.state = {defaultPath: ""} - } - - componentDidMount = () => { - invoke("get_home",).then( - (path) => { - let ps = "/"; - if (path.indexOf("\\") > 0) { - ps = "\\" - } - path = [path, "acrn-work", "MyConfiguration"].join(ps) + ps - console.log(path) - this.setState({defaultPath: path}) - - } - ) - } - - addRecentDir = async (dirPath) => { - let {configurator} = this.context; - await configurator.addHistory("recentlyWorkingFolders", dirPath); - } - - nextPage = (WorkingFolder) => { - this.addRecentDir(WorkingFolder) - .then(() => { - let {configurator} = this.context; - let params = configurator.settingWorkingFolder(WorkingFolder) - this.navigate(params); - }) - } - - openDir = () => { - dialog.open({ - title: "Start new configurator", - directory: true, - multiple: false - }).then((filePath) => { - this.pathInput.current.value = filePath - }).catch() - } - - useFolder = async () => { - let {helper} = this.context - let folderPath = this.pathInput.current.value ? this.pathInput.current.value : this.pathInput.current.placeholder; - helper.resolveHome(folderPath).then((homeResolvePath) => { - fs.readDir(homeResolvePath) - .then((files) => { - console.log("Directory exists.", files) - if (files.length > 0) { - confirm("Directory exists, overwrite it?") - .then((r) => { - if (r) this.nextPage(folderPath) - }) - } else { - this.nextPage(folderPath) - } - }) - .catch(() => { - fs.createDir(homeResolvePath, {recursive: true}) - .then(() => { - console.log('Directory created successfully!'); - this.nextPage(folderPath) - }).catch((err) => { - return console.error(err); - }) - }) - }) - } - - - handleConfirm = (params) => { - console.log(params) - } - - - render = () => { - return (
    - Start a new - configuration -

    - ACRN Configurator saves your scenario and configuration files into a working - folder. -

    - - - - - - - - - - - -
    - - - Browse for folder… -
    -
    - - -
    -
    -
    -
    ) - } -} - -StartNewConfigurationPanel.contextType = ACRNContext; - -export default function (props) { - const navigate = useNavigate(); - - return ; -} \ No newline at end of file diff --git a/misc/config_tools/configurator/src/pages/Welcome/StartNewConfigurationPanel/index.jsx b/misc/config_tools/configurator/src/pages/Welcome/StartNewConfigurationPanel/index.jsx deleted file mode 100644 index 02eed6cdb..000000000 --- a/misc/config_tools/configurator/src/pages/Welcome/StartNewConfigurationPanel/index.jsx +++ /dev/null @@ -1,3 +0,0 @@ -import StartNewConfigurationPanel from "./StartNewConfigurationPanel"; - -export default StartNewConfigurationPanel \ No newline at end of file diff --git a/misc/config_tools/configurator/src/pages/Welcome/UseAnExistingConfigurationPanel/UseAnExistingConfigurationPanel.jsx b/misc/config_tools/configurator/src/pages/Welcome/UseAnExistingConfigurationPanel/UseAnExistingConfigurationPanel.jsx deleted file mode 100644 index 1e2217bf0..000000000 --- a/misc/config_tools/configurator/src/pages/Welcome/UseAnExistingConfigurationPanel/UseAnExistingConfigurationPanel.jsx +++ /dev/null @@ -1,123 +0,0 @@ -import {useNavigate} from "react-router"; -import React from "react"; -import {Button, Form} from "react-bootstrap"; -import {dialog} from "@tauri-apps/api"; -import {ACRNContext} from "../../../ACRNContext"; - - -class UseAnExistingConfigurationPanel extends React.Component { - constructor(props) { - super(props); - const {navigate} = this.props; - this.navigate = navigate - this.pathSelect = React.createRef() - this.state = { - recentDirs: [] - } - } - - componentDidMount() { - this.updateHistory() - } - - updateHistory = () => { - let {configurator} = this.context - return configurator.getHistory("recentlyWorkingFolders") - .then((recentDirs) => { - this.setState({recentDirs}) - }) - } - - recentDir = () => { - let recent = this.state.recentDirs; - let result = [] - for (let i = 0; i < recent.length; i++) { - let dirPath = recent[i]; - result.push() - } - - return result; - } - - addRecentDir = (dirPath) => { - let {config, configurator} = this.context - return configurator.addHistory("recentlyWorkingFolders", dirPath) - } - - nextPage = (WorkingFolder) => { - let {configurator} = this.context - this.addRecentDir(WorkingFolder).then(() => { - let params = configurator.settingWorkingFolder(WorkingFolder) - this.navigate(params); - }) - } - - openDir = async () => { - await dialog.open({ - title: 'Open Working Folder', - directory: true, - multiple: false - }).then(async (existDir) => { - await this.addRecentDir(existDir) - await this.updateHistory() - this.pathSelect.current.value = existDir - }).catch() - } - - useFolder = () => { - let folderPath = this.pathSelect.current.value; - if (!folderPath) { - alert("Please select existing configuration folder!") - return - } - this.nextPage(folderPath) - } - - render() { - let recent_dir = this.recentDir(); - return ( -
    - Use an existing configuration -

    - Open a working folder to retrieve an existing configuration. -

    - - - - - - - - - - - -
    - - {recent_dir} - - - Browse for folder… -
    -
    - -
    -
    -
    - -
    - ) - } -} - -UseAnExistingConfigurationPanel.contextType = ACRNContext - -export default function (props) { - const navigate = useNavigate(); - - return ; -} diff --git a/misc/config_tools/configurator/src/pages/Welcome/UseAnExistingConfigurationPanel/index.jsx b/misc/config_tools/configurator/src/pages/Welcome/UseAnExistingConfigurationPanel/index.jsx deleted file mode 100644 index 8a1258bda..000000000 --- a/misc/config_tools/configurator/src/pages/Welcome/UseAnExistingConfigurationPanel/index.jsx +++ /dev/null @@ -1,3 +0,0 @@ -import UseAnExistingConfigurationPanel from "./UseAnExistingConfigurationPanel"; - -export default UseAnExistingConfigurationPanel \ No newline at end of file diff --git a/misc/config_tools/configurator/src/pages/Welcome/UseExisting.vue b/misc/config_tools/configurator/src/pages/Welcome/UseExisting.vue new file mode 100644 index 000000000..ef7ce17a7 --- /dev/null +++ b/misc/config_tools/configurator/src/pages/Welcome/UseExisting.vue @@ -0,0 +1,89 @@ + + + + + \ No newline at end of file diff --git a/misc/config_tools/configurator/src/pages/Welcome/Welcome.css b/misc/config_tools/configurator/src/pages/Welcome/Welcome.css deleted file mode 100644 index 8f25f2239..000000000 --- a/misc/config_tools/configurator/src/pages/Welcome/Welcome.css +++ /dev/null @@ -1,8 +0,0 @@ -.wel-btn { - max-width: 221px; - width: 100%; -} - -.banner.welcome { - min-height: 164px; -} diff --git a/misc/config_tools/configurator/src/pages/Welcome/Welcome.jsx b/misc/config_tools/configurator/src/pages/Welcome/Welcome.jsx deleted file mode 100644 index 61c49c1cd..000000000 --- a/misc/config_tools/configurator/src/pages/Welcome/Welcome.jsx +++ /dev/null @@ -1,53 +0,0 @@ -import React from "react"; -import {Col, Container, Row} from "react-bootstrap"; - -import './Welcome.css' - -import Banner from "../../components/Banner"; - -import StartNewConfigurationPanel from "./StartNewConfigurationPanel"; -import UseAnExistingConfigurationPanel from "./UseAnExistingConfigurationPanel"; -import Footer from "../../components/Footer"; - -class Welcome extends React.Component { - render() { - return ( -
    - - -
    - ACRN Configurator helps you set up and customize your ACRN hypervisor and VMs. -
    -
    -

    -

    This is a preview version, please be careful.
    - If you find a bug, please report it to   - - https://github.com/Weiyi-Feng/acrn-hypervisor - . -

    - - - -
    - -
    - - - -
    - -
    - - -
    - -
    -
    - -
    - ) - } -} - -export default Welcome diff --git a/misc/config_tools/configurator/src/plugin/text-plugin.js b/misc/config_tools/configurator/src/plugin/text-plugin.js deleted file mode 100644 index 2ebdfa92e..000000000 --- a/misc/config_tools/configurator/src/plugin/text-plugin.js +++ /dev/null @@ -1,17 +0,0 @@ -export default function textFileResolver(fileRegex) { - function compileFileToJS(src) { - return src; - } - return { - name: 'transform-xsd-file', - transform(src, id) { - if (fileRegex.test(id)) { - return { - code: compileFileToJS(src), - map: null // 如果可行将提供 source map - }; - } - } - }; -} -//# sourceMappingURL=text-plugin.js.map \ No newline at end of file diff --git a/misc/config_tools/configurator/src/plugin/text-plugin.js.map b/misc/config_tools/configurator/src/plugin/text-plugin.js.map deleted file mode 100644 index 53d2a40a1..000000000 --- a/misc/config_tools/configurator/src/plugin/text-plugin.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"text-plugin.js","sourceRoot":"","sources":["text-plugin.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,SAAiB;IACtD,SAAS,eAAe,CAAC,GAAW;QAChC,OAAO,GAAG,CAAA;IACd,CAAC;IAED,OAAO;QACH,IAAI,EAAE,oBAAoB;QAC1B,SAAS,CAAC,GAAW,EAAE,EAAU;YAC7B,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;gBACpB,OAAO;oBACH,IAAI,EAAE,eAAe,CAAC,GAAG,CAAC;oBAC1B,GAAG,EAAE,IAAI,CAAC,qBAAqB;iBAClC,CAAA;aACJ;QACL,CAAC;KACJ,CAAA;AACL,CAAC"} \ No newline at end of file diff --git a/misc/config_tools/configurator/src/plugin/text-plugin.ts b/misc/config_tools/configurator/src/plugin/text-plugin.ts deleted file mode 100644 index eab74d1e8..000000000 --- a/misc/config_tools/configurator/src/plugin/text-plugin.ts +++ /dev/null @@ -1,24 +0,0 @@ -import _ from "lodash"; -import * as fs from "fs"; - -export default function textFileResolver(fileRegex: RegExp) { - function compileFileToJS(id: string, src: string) { - if (_.endsWith(id, '.txt')) { - let src = fs.readFileSync(id, {encoding: "utf-8"}) - return "export default " + JSON.stringify(src) - } - return "export default " + JSON.stringify(src) - } - - return { - name: 'text-file-resolver', - transform(src: string, id: string) { - if (fileRegex.test(id)) { - return { - code: compileFileToJS(id, src), - map: null // 如果可行将提供 source map - } - } - } - } -} \ No newline at end of file diff --git a/misc/config_tools/configurator/src/router.js b/misc/config_tools/configurator/src/router.js new file mode 100644 index 000000000..b604c9eec --- /dev/null +++ b/misc/config_tools/configurator/src/router.js @@ -0,0 +1,15 @@ +import Welcome from "./pages/Welcome.vue"; +import Config from "./pages/Config.vue"; + +import {createRouter, createWebHashHistory} from 'vue-router' + +const routes = [ + {name: "Welcome", path: '/', component: Welcome}, + {name: "Config", path: '/config/:WorkingFolder', component: Config, props: true}, +] + +const router = createRouter({ + history: createWebHashHistory(), + routes, +}) +export default router; diff --git a/misc/config_tools/configurator/thirdLib/.gitignore b/misc/config_tools/configurator/thirdLib/.gitignore new file mode 100644 index 000000000..661edc30a --- /dev/null +++ b/misc/config_tools/configurator/thirdLib/.gitignore @@ -0,0 +1,2 @@ +pyodide +*.whl diff --git a/misc/config_tools/configurator/thirdLib/library.json b/misc/config_tools/configurator/thirdLib/library.json new file mode 100644 index 000000000..c6a9806fa --- /dev/null +++ b/misc/config_tools/configurator/thirdLib/library.json @@ -0,0 +1,129 @@ +{ + "title": "ACRN Third Part Library List", + "library": [ + { + "name": "acrn_config_tools@3.0", + "check": { + "type": "file", + "path": "acrn_config_tools-3.0-py3-none-any.whl" + }, + "clean": [ + "acrn_config_tools-3.0-py3-none-any.whl" + ], + "install": [ + { + "type": "copy", + "from": "../../dist/acrn_config_tools-3.0-py3-none-any.whl", + "to": "acrn_config_tools-3.0-py3-none-any.whl" + } + ] + }, + { + "name": "pyodide@0.20.0", + "check": { + "type": "file", + "path": "pyodide/pyodide.js" + }, + "clean": [ + "pyodide-build-0.20.0.tar.bz2", + "pyodide" + ], + "install": [ + { + "type": "download", + "from": "https://github.com/pyodide/pyodide/releases/download/0.20.0/pyodide-build-0.20.0.tar.bz2", + "to": "pyodide-build-0.20.0.tar.bz2" + }, + { + "type": "extract", + "from": "pyodide-build-0.20.0.tar.bz2", + "to": "." + }, + { + "type": "remove", + "path": "pyodide-build-0.20.0.tar.bz2" + }, + { + "type": "replaceText", + "file": "pyodide/pyodide.mjs", + "old": "yield import(url)", + "new": "yield import(/* @vite-ignore */url)" + }, + { + "type": "replaceText", + "file": "pyodide/pyodide.mjs", + "old": "yield import(nodePathMod.resolve(url))", + "new": "yield import(/* @vite-ignore */nodePathMod.resolve(url))" + } + ] + }, + { + "name": "xmltodict@0.12.0", + "check": { + "type": "file", + "path": "xmltodict-0.12.0-py2.py3-none-any.whl" + }, + "clean": [ + "xmltodict-0.12.0-py2.py3-none-any.whl" + ], + "install": [ + { + "type": "download", + "from": "https://files.pythonhosted.org/packages/28/fd/30d5c1d3ac29ce229f6bdc40bbc20b28f716e8b363140c26eff19122d8a5/xmltodict-0.12.0-py2.py3-none-any.whl", + "to": "xmltodict-0.12.0-py2.py3-none-any.whl" + } + ] + }, + { + "name": "elementpath@2.5.0", + "check": { + "type": "file", + "path": "elementpath-2.4.0-py3-none-any.whl" + }, + "clean": [ + "elementpath-2.4.0-py3-none-any.whl" + ], + "install": [ + { + "type": "download", + "from": "https://files.pythonhosted.org/packages/7e/35/55a92f54f018c20e717223a0561bb60bf5053170c86b4b3624368f2da137/elementpath-2.4.0-py3-none-any.whl", + "to": "elementpath-2.4.0-py3-none-any.whl" + } + ] + }, + { + "name": "xmlschema@1.9.2", + "check": { + "type": "file", + "path": "xmlschema-1.9.2-py3-none-any.whl" + }, + "clean": [ + "xmlschema-1.9.2-py3-none-any.whl" + ], + "install": [ + { + "type": "download", + "from": "https://files.pythonhosted.org/packages/25/65/fda28ac5228759d203cc2bac85337b4449a235b1b12b9a3fd6cd4dc7a892/xmlschema-1.9.2-py3-none-any.whl", + "to": "xmlschema-1.9.2-py3-none-any.whl" + } + ] + }, + { + "name": "defusedxml-0.7.1-py2.py3-none-any.whl", + "check": { + "type": "file", + "path": "defusedxml-0.7.1-py2.py3-none-any.whl" + }, + "clean": [ + "defusedxml-0.7.1-py2.py3-none-any.whl" + ], + "install": [ + { + "type": "download", + "from": "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", + "to": "defusedxml-0.7.1-py2.py3-none-any.whl" + } + ] + } + ] +} \ No newline at end of file diff --git a/misc/config_tools/configurator/thirdLib/manager.py b/misc/config_tools/configurator/thirdLib/manager.py new file mode 100644 index 000000000..12bfe1f8b --- /dev/null +++ b/misc/config_tools/configurator/thirdLib/manager.py @@ -0,0 +1,125 @@ +#!/usr/bin/env python3 +""" +misc/config_tools/configurator/thirdLib/manager.py +depend on misc/config_tools/configurator/thirdLib/library.json +""" +import argparse +import os +import json +import shutil +import tarfile +from pathlib import Path + +import requests +from tqdm.auto import tqdm + + +def check(library_info, operation): + if operation == 'check': + print('Check:') + for library in library_info['library']: + library_name = library["name"] + + check_type = library['check']['type'] + if check_type == 'file': + check_file = library['check']['path'] + check_result = os.path.isfile(check_file) + + if operation == 'check': + print(f'{library["name"]}: {check_result}') + elif operation == 'install' and not check_result: + library_install = library["install"] + install(library_name, library_install) + elif operation == 'clean' and check_result: + clean(library_name, library['clean']) + + +def install(library_name, library_install): + print(f'Install: {library_name}') + for step in library_install: + step_type = step['type'] + if step_type == "copy": + copy_from = step['from'] + copy_to = step['to'] + shutil.copyfile(copy_from, copy_to) + print(f"copy: {copy_to} success") + elif step_type == "download": + download_from = step['from'] + download_to = step['to'] + + with requests.get(download_from, stream=True) as r: + total_length = int(r.headers.get("Content-Length")) + with tqdm.wrapattr(r.raw, "read", total=total_length, desc="") as raw: + with open(download_to, 'wb') as output: + shutil.copyfileobj(raw, output) + print(f'download: {download_to} success') + elif step_type == "extract": + tar_file: str = step['from'] + tar_mode = tar_file.split('.')[-1] + assert tar_mode in ['gz', 'bz2', 'xz', 'tar'] + print(f'extract: {tar_file}') + with tarfile.open(tar_file, 'r') as tar: + tar.extractall(path=step['to'], members=tar) + print(f'extract: {tar_file} success') + elif step_type == 'remove': + remove_path = step['path'] + if os.path.isfile(remove_path): + os.remove(remove_path) + else: + shutil.rmtree(remove_path) + print(f'remove: {remove_path} success') + elif step_type == "replaceText": + filename = step['file'] + file_content = open(filename, encoding='utf-8').read() + replace_old = step['old'] + replace_new = step['new'] + file_content = file_content.replace(replace_old, replace_new) + open(filename, 'w', encoding='utf-8').write(file_content) + print(f"replaceText: {filename} success") + else: + print(step) + raise ValueError + print(f'Install: {library_name} success') + + +def clean(library_name, library_clean): + print(f'Clean: {library_name}') + for clean_path in library_clean: + if os.path.isfile(clean_path): + os.remove(clean_path) + elif os.path.isdir(clean_path): + shutil.rmtree(clean_path) + print(f'remove: {clean_path} success') + print(f'Clean: {library_name} success') + + +def manager(operation, library_info): + cwd = os.path.abspath(os.getcwd()) + + third_dir = os.path.dirname( + os.path.abspath(__file__) + ) + os.chdir(third_dir) + + if operation in ['check', 'install', 'clean']: + check(library_info, operation) + os.chdir(cwd) + + +def main(): + library_json = Path(__file__).parent / 'library.json' + + parser = argparse.ArgumentParser( + description='ACRN Configurator third part library manager.' + ) + parser.add_argument('operation', choices=['check', 'install', 'clean']) + parser.add_argument('-c', '--config', dest='config', default=library_json) + + args = parser.parse_args() + library_info = json.load(open(args.config, encoding='utf-8')) + + manager(args.operation, library_info) + + +if __name__ == '__main__': + main() diff --git a/misc/config_tools/configurator/src/plugin/tauri-plugin.ts b/misc/config_tools/configurator/thirdLib/tauri-plugin.ts similarity index 50% rename from misc/config_tools/configurator/src/plugin/tauri-plugin.ts rename to misc/config_tools/configurator/thirdLib/tauri-plugin.ts index 4cb4ce9e7..3ceb6d6a8 100644 --- a/misc/config_tools/configurator/src/plugin/tauri-plugin.ts +++ b/misc/config_tools/configurator/thirdLib/tauri-plugin.ts @@ -2,18 +2,71 @@ const fs = require('fs') const path = require('path') import type {ConfigEnv, Plugin, ResolvedConfig} from "vite"; +// @ts-ignore import replace from "@rollup/plugin-replace"; +// @ts-ignore import cli from "@tauri-apps/cli" -import Config from "../../src-tauri/types/config" +import Config from "../src-tauri/types/config" -import tauriConf from "../../src-tauri/tauri.json"; +// @ts-ignore +import tauriConf from "../src-tauri/tauri.json"; interface Options { config?: (c: Config, e: ConfigEnv) => Config; } +function copyFolder(copiedPath, resultPath, direct) { + if (!direct) { + copiedPath = path.join(__dirname, copiedPath) + resultPath = path.join(__dirname, resultPath) + } + + function createDir(dirPath) { + fs.mkdirSync(dirPath) + } + + if (fs.existsSync(copiedPath)) { + createDir(resultPath) + /** + * @des 方式一:利用子进程操作命令行方式 + */ + // child_process.spawn('cp', ['-r', copiedPath, resultPath]) + + /** + * @des 方式二: + */ + const files = fs.readdirSync(copiedPath, {withFileTypes: true}); + for (let i = 0; i < files.length; i++) { + const cf = files[i] + const ccp = path.join(copiedPath, cf.name) + const crp = path.join(resultPath, cf.name) + if (cf.isFile()) { + /** + * @des 创建文件,使用流的形式可以读写大文件 + */ + const readStream = fs.createReadStream(ccp) + const writeStream = fs.createWriteStream(crp) + readStream.pipe(writeStream) + } else { + try { + /** + * @des 判断读(R_OK | W_OK)写权限 + */ + fs.accessSync(path.join(crp, '..'), fs.constants.W_OK) + copyFolder(ccp, crp, true) + } catch (error) { + console.log('folder write error:', error); + } + + } + } + } else { + console.log('do not exist path: ', copiedPath); + } +} + export default (options?: Options): Plugin => { let tauriConfig: Config = {...tauriConf}; @@ -22,7 +75,7 @@ export default (options?: Options): Plugin => { const tauri = (mode: "dev" | "build"): Promise => { // Generate `tauri.conf.json` by `tauri.json`. console.log("Generate `tauri.conf.json` by `tauri.json`.") - let filePath = path.resolve(__dirname, '..', '..', 'src-tauri', 'tauri.conf.json') + let filePath = path.resolve(__dirname, '..', 'src-tauri', 'tauri.conf.json') let config = JSON.stringify(tauriConfig) try { fs.writeFileSync(filePath, config) @@ -52,6 +105,7 @@ export default (options?: Options): Plugin => { if (!process.env.TAURI_BUILD) { process.env.TAURI_BUILD = "true"; delete tauriConfig["$schema"] + copyFolder('../thirdLib', '../build/thirdLib', false) tauri('build').finally() } }, diff --git a/misc/config_tools/configurator/tsconfig.json b/misc/config_tools/configurator/tsconfig.json index 9450bff21..22bafa097 100644 --- a/misc/config_tools/configurator/tsconfig.json +++ b/misc/config_tools/configurator/tsconfig.json @@ -2,7 +2,7 @@ "compilerOptions": { "target": "esnext", "module": "esnext", - "strict": true, + "strict": false, "moduleResolution": "node", "resolveJsonModule": true, "sourceMap": true, diff --git a/misc/config_tools/configurator/vite.config.js b/misc/config_tools/configurator/vite.config.js index 5435694b0..e137d79b9 100644 --- a/misc/config_tools/configurator/vite.config.js +++ b/misc/config_tools/configurator/vite.config.js @@ -1,16 +1,13 @@ import path from "path"; import {defineConfig} from 'vite' - -import react from '@vitejs/plugin-react' -import tauri from './src/plugin/tauri-plugin' -import textFileResolver from './src/plugin/text-plugin' - +import vue from '@vitejs/plugin-vue' +import tauri from "./thirdLib/tauri-plugin"; // https://vitejs.dev/config/ export default defineConfig({ base: './', - plugins: [react(), tauri(), textFileResolver(/\.(xsd|py|txt)$/)], + plugins: [vue(), tauri()], build: { outDir: path.resolve(__dirname, 'build') } diff --git a/misc/config_tools/configurator/yarn.lock b/misc/config_tools/configurator/yarn.lock index 347167f30..48dba7766 100644 --- a/misc/config_tools/configurator/yarn.lock +++ b/misc/config_tools/configurator/yarn.lock @@ -2,361 +2,59 @@ # yarn lockfile v1 -"@ampproject/remapping@^2.1.0": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.1.2.tgz#4edca94973ded9630d20101cd8559cedb8d8bd34" - integrity sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg== - dependencies: - "@jridgewell/trace-mapping" "^0.3.0" - -"@babel/code-frame@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" - integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== - dependencies: - "@babel/highlight" "^7.16.7" - -"@babel/compat-data@^7.16.4": - version "7.17.0" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.0.tgz#86850b8597ea6962089770952075dcaabb8dba34" - integrity sha512-392byTlpGWXMv4FbyWw3sAZ/FrW/DrwqLGXpy0mbyNe9Taqv1mg9yON5/o0cnr8XYCkFTZbC1eV+c+LAROgrng== - -"@babel/core@^7.16.12": - version "7.17.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.17.5.tgz#6cd2e836058c28f06a4ca8ee7ed955bbf37c8225" - integrity sha512-/BBMw4EvjmyquN5O+t5eh0+YqB3XXJkYD2cjKpYtWOfFy4lQ4UozNSmxAcWT8r2XtZs0ewG+zrfsqeR15i1ajA== - dependencies: - "@ampproject/remapping" "^2.1.0" - "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.17.3" - "@babel/helper-compilation-targets" "^7.16.7" - "@babel/helper-module-transforms" "^7.16.7" - "@babel/helpers" "^7.17.2" - "@babel/parser" "^7.17.3" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.17.3" - "@babel/types" "^7.17.0" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.1.2" - semver "^6.3.0" - -"@babel/generator@^7.17.3": - version "7.17.3" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.3.tgz#a2c30b0c4f89858cb87050c3ffdfd36bdf443200" - integrity sha512-+R6Dctil/MgUsZsZAkYgK+ADNSZzJRRy0TvY65T71z/CR854xHQ1EweBYXdfT+HNeN7w0cSJJEzgxZMv40pxsg== - dependencies: - "@babel/types" "^7.17.0" - jsesc "^2.5.1" - source-map "^0.5.0" - -"@babel/helper-annotate-as-pure@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz#bb2339a7534a9c128e3102024c60760a3a7f3862" - integrity sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-compilation-targets@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz#06e66c5f299601e6c7da350049315e83209d551b" - integrity sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA== - dependencies: - "@babel/compat-data" "^7.16.4" - "@babel/helper-validator-option" "^7.16.7" - browserslist "^4.17.5" - semver "^6.3.0" - -"@babel/helper-environment-visitor@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz#ff484094a839bde9d89cd63cba017d7aae80ecd7" - integrity sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-function-name@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz#f1ec51551fb1c8956bc8dd95f38523b6cf375f8f" - integrity sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA== - dependencies: - "@babel/helper-get-function-arity" "^7.16.7" - "@babel/template" "^7.16.7" - "@babel/types" "^7.16.7" - -"@babel/helper-get-function-arity@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz#ea08ac753117a669f1508ba06ebcc49156387419" - integrity sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-hoist-variables@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246" - integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-module-imports@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437" - integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-module-transforms@^7.16.7": - version "7.17.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.17.6.tgz#3c3b03cc6617e33d68ef5a27a67419ac5199ccd0" - integrity sha512-2ULmRdqoOMpdvkbT8jONrZML/XALfzxlb052bldftkicAUy8AxSCkD5trDPQcwHNmolcl7wP6ehNqMlyUw6AaA== - dependencies: - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-module-imports" "^7.16.7" - "@babel/helper-simple-access" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" - "@babel/helper-validator-identifier" "^7.16.7" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.17.3" - "@babel/types" "^7.17.0" - -"@babel/helper-plugin-utils@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz#aa3a8ab4c3cceff8e65eb9e73d87dc4ff320b2f5" - integrity sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA== - -"@babel/helper-simple-access@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz#d656654b9ea08dbb9659b69d61063ccd343ff0f7" - integrity sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-split-export-declaration@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b" - integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-validator-identifier@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" - integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== - -"@babel/helper-validator-option@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23" - integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== - -"@babel/helpers@^7.17.2": - version "7.17.2" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.17.2.tgz#23f0a0746c8e287773ccd27c14be428891f63417" - integrity sha512-0Qu7RLR1dILozr/6M0xgj+DFPmi6Bnulgm9M8BVa9ZCWxDqlSnqt3cf8IDPB5m45sVXUZ0kuQAgUrdSFFH79fQ== - dependencies: - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.17.0" - "@babel/types" "^7.17.0" - -"@babel/highlight@^7.16.7": - version "7.16.10" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.10.tgz#744f2eb81579d6eea753c227b0f570ad785aba88" - integrity sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw== - dependencies: - "@babel/helper-validator-identifier" "^7.16.7" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/parser@^7.16.7", "@babel/parser@^7.17.3": - version "7.17.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.3.tgz#b07702b982990bf6fdc1da5049a23fece4c5c3d0" - integrity sha512-7yJPvPV+ESz2IUTPbOL+YkIGyCqOyNIzdguKQuJGnH7bg1WTIifuM21YqokFt/THWh1AkCRn9IgoykTRCBVpzA== - -"@babel/plugin-syntax-jsx@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz#50b6571d13f764266a113d77c82b4a6508bbe665" - integrity sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-react-jsx-development@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz#43a00724a3ed2557ed3f276a01a929e6686ac7b8" - integrity sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A== - dependencies: - "@babel/plugin-transform-react-jsx" "^7.16.7" - -"@babel/plugin-transform-react-jsx-self@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.16.7.tgz#f432ad0cba14c4a1faf44f0076c69e42a4d4479e" - integrity sha512-oe5VuWs7J9ilH3BCCApGoYjHoSO48vkjX2CbA5bFVhIuO2HKxA3vyF7rleA4o6/4rTDbk6r8hBW7Ul8E+UZrpA== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-react-jsx-source@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.16.7.tgz#1879c3f23629d287cc6186a6c683154509ec70c0" - integrity sha512-rONFiQz9vgbsnaMtQlZCjIRwhJvlrPET8TabIUK2hzlXw9B9s2Ieaxte1SCOOXMbWRHodbKixNf3BLcWVOQ8Bw== - dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - -"@babel/plugin-transform-react-jsx@^7.16.7": - version "7.17.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.3.tgz#eac1565da176ccb1a715dae0b4609858808008c1" - integrity sha512-9tjBm4O07f7mzKSIlEmPdiE6ub7kfIe6Cd+w+oQebpATfTQMAgW+YOuWxogbKVTulA+MEO7byMeIUtQ1z+z+ZQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-module-imports" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-jsx" "^7.16.7" - "@babel/types" "^7.17.0" - -"@babel/runtime@^7.13.16", "@babel/runtime@^7.14.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.7": - version "7.17.2" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.2.tgz#66f68591605e59da47523c631416b18508779941" - integrity sha512-hzeyJyMA1YGdJTuWU0e/j4wKXrU4OMFvY2MSlaI9B7VQb0r5cxTE3EAIS2Q7Tn2RIcDkRvTA/v2JsAEhxe99uw== - dependencies: - regenerator-runtime "^0.13.4" +"@babel/parser@^7.16.4": + version "7.17.9" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.9.tgz#9c94189a6062f0291418ca021077983058e171ef" + integrity sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg== "@babel/runtime@^7.17.2": - version "7.17.8" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.8.tgz#3e56e4aff81befa55ac3ac6a0967349fd1c5bca2" - integrity sha512-dQpEpK0O9o6lj6oPu0gRDbbnk+4LeHlNcBpspf6Olzt3GIX4P1lWF1gS+pHLDFlaJvbR6q7jCfQ08zA4QJBnmA== + version "7.17.9" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.9.tgz#d19fbf802d01a8cb6cf053a64e472d42c434ba72" + integrity sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg== dependencies: regenerator-runtime "^0.13.4" -"@babel/template@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" - integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== +"@css-render/plugin-bem@^0.15.9": + version "0.15.9" + resolved "https://registry.yarnpkg.com/@css-render/plugin-bem/-/plugin-bem-0.15.9.tgz#204ccdb65fdfd293b8cbcf587c8f31633f41f513" + integrity sha512-xASEmYIX91Pow7YPzpAZ0eyrRNINVX7j9ITNbLt88gJHRLap3P1dv3hTSLtUZTxYXVHTklZ/SfJQ9FIO3jRahg== + +"@css-render/vue3-ssr@^0.15.7", "@css-render/vue3-ssr@^0.15.9": + version "0.15.9" + resolved "https://registry.yarnpkg.com/@css-render/vue3-ssr/-/vue3-ssr-0.15.9.tgz#59ce56a0ee417748845af9e29784235381f9b049" + integrity sha512-b3wvEIZYjToOEAV/oUqVtcg+MPF/iSZB9VmVF7fMAAAfvVTc2kB4TZDhGZCMkGjGZxOUm1jia7q/Z9FJnJGLKw== + +"@emotion/hash@~0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413" + integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow== + +"@lljj/vjsf-utils@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@lljj/vjsf-utils/-/vjsf-utils-1.12.2.tgz#b5420465d5482eade6cbe568a502abc23a1d6298" + integrity sha512-chyBkvCGMy/yh+3cow8BK+NWu3Ly/Kwkeb490qo3DE3J0XIMXahBFQ15w8UTbn5ZCvsNdy8tEONC2q/NXTxIjQ== dependencies: - "@babel/code-frame" "^7.16.7" - "@babel/parser" "^7.16.7" - "@babel/types" "^7.16.7" + ajv "^6.10.2" -"@babel/traverse@^7.17.0", "@babel/traverse@^7.17.3": - version "7.17.3" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.17.3.tgz#0ae0f15b27d9a92ba1f2263358ea7c4e7db47b57" - integrity sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw== +"@lljj/vue3-form-core@1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@lljj/vue3-form-core/-/vue3-form-core-1.12.2.tgz#0b757e9ce3378a6a246f454d66ea8113cac7293e" + integrity sha512-b61ILRrr8YNqD3x0LgT/DfMycuFsibrN2nG0+xG/55piVVskHjxD/smy/UXHqsNDwZrUsho2d30PU77+n1PfBQ== dependencies: - "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.17.3" - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-function-name" "^7.16.7" - "@babel/helper-hoist-variables" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" - "@babel/parser" "^7.17.3" - "@babel/types" "^7.17.0" - debug "^4.1.0" - globals "^11.1.0" + "@lljj/vjsf-utils" "1.12.2" -"@babel/types@^7.16.7", "@babel/types@^7.17.0": - version "7.17.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.0.tgz#a826e368bccb6b3d84acd76acad5c0d87342390b" - integrity sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw== +"@lljj/vue3-form-naive@^1.12.2": + version "1.12.2" + resolved "https://registry.yarnpkg.com/@lljj/vue3-form-naive/-/vue3-form-naive-1.12.2.tgz#f6f954130e9f8c5901ce96f9e0768d7ef38e7062" + integrity sha512-GFYVr4e6XUkgLlwyvto0rNfoNAxHNj3TmXHUFc0EyltYqqMHTwVE3g2mAMtaiHi77N/m1vHlnvdN0dlt6xwhjw== dependencies: - "@babel/helper-validator-identifier" "^7.16.7" - to-fast-properties "^2.0.0" + "@lljj/vjsf-utils" "1.12.2" + "@lljj/vue3-form-core" "1.12.2" -"@fortawesome/fontawesome-common-types@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.3.0.tgz#949995a05c0d8801be7e0a594f775f1dbaa0d893" - integrity sha512-CA3MAZBTxVsF6SkfkHXDerkhcQs0QPofy43eFdbWJJkZiq3SfiaH1msOkac59rQaqto5EqWnASboY1dBuKen5w== - -"@fortawesome/fontawesome-svg-core@^1.3.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.3.0.tgz#343fac91fa87daa630d26420bfedfba560f85885" - integrity sha512-UIL6crBWhjTNQcONt96ExjUnKt1D68foe3xjEensLDclqQ6YagwCRYVQdrp/hW0ALRp/5Fv/VKw+MqTUWYYvPg== - dependencies: - "@fortawesome/fontawesome-common-types" "^0.3.0" - -"@fortawesome/free-regular-svg-icons@^6.0.0": - version "6.0.0" - resolved "https://registry.yarnpkg.com/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-6.0.0.tgz#f3cb91dac643472fe8138024b93fbfbdf05675cc" - integrity sha512-lYK6oyQL8HwZUAVWGqF7TGuwQBVfphNBVTdvPSD3h4gmQfGazm/xcwg3kmtcRycu3y6QspOC7hPXSoJbVqSYCw== - dependencies: - "@fortawesome/fontawesome-common-types" "^0.3.0" - -"@fortawesome/free-solid-svg-icons@^6.0.0": - version "6.0.0" - resolved "https://registry.yarnpkg.com/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.0.0.tgz#bed4a501b631c6cfa35c09830f7cb63ffca1589d" - integrity sha512-o4FZ1XbndcgeWNb8Wh0y+Hgf73CjmyOQowUSaqQCtgIIdS+XliSBSOwCl330wER+I6CGYE96hT27bHBPmzX2Gg== - dependencies: - "@fortawesome/fontawesome-common-types" "^0.3.0" - -"@fortawesome/react-fontawesome@^0.1.17": - version "0.1.17" - resolved "https://registry.yarnpkg.com/@fortawesome/react-fontawesome/-/react-fontawesome-0.1.17.tgz#06fc06cb1a721e38e5b50b4a1cb851e9b9c77d7a" - integrity sha512-dX43Z5IvMaW7fwzU8farosYjKNGfRb2HB/DgjVBHeJZ/NSnuuaujPPx0YOdcAq+n3mqn70tyCde2HM1mqbhiuw== - dependencies: - prop-types "^15.8.1" - -"@jridgewell/resolve-uri@^3.0.3": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz#68eb521368db76d040a6315cdb24bf2483037b9c" - integrity sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew== - -"@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.11" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz#771a1d8d744eeb71b6adb35808e1a6c7b9b8c8ec" - integrity sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg== - -"@jridgewell/trace-mapping@^0.3.0": - version "0.3.4" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz#f6a0832dffd5b8a6aaa633b7d9f8e8e94c83a0c3" - integrity sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@popperjs/core@^2.10.1", "@popperjs/core@^2.11.2": - version "2.11.2" - resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.2.tgz#830beaec4b4091a9e9398ac50f865ddea52186b9" - integrity sha512-92FRmppjjqz29VMJ2dn+xdyXZBrMlE42AV6Kq6BwjWV7CNUW1hs2FtxSNLQE+gJhaZ6AAmYuO9y8dshhcBl7vA== - -"@react-aria/ssr@^3.0.1": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@react-aria/ssr/-/ssr-3.1.2.tgz#665a6fd56385068c7417922af2d0d71b0618e52d" - integrity sha512-amXY11ImpokvkTMeKRHjsSsG7v1yzzs6yeqArCyBIk60J3Yhgxwx9Cah+Uu/804ATFwqzN22AXIo7SdtIaMP+g== - dependencies: - "@babel/runtime" "^7.6.2" - -"@restart/hooks@^0.4.0", "@restart/hooks@^0.4.5": - version "0.4.5" - resolved "https://registry.yarnpkg.com/@restart/hooks/-/hooks-0.4.5.tgz#e7acbea237bfc9e479970500cf87538b41a1ed02" - integrity sha512-tLGtY0aHeIfT7aPwUkvQuhIy3+q3w4iqmUzFLPlOAf/vNUacLaBt1j/S//jv/dQhenRh8jvswyMojCwmLvJw8A== - dependencies: - dequal "^2.0.2" - -"@restart/ui@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@restart/ui/-/ui-1.0.1.tgz#379f8340ab14adc18522731a1be6e32eaa10ef92" - integrity sha512-hLAqltcAjQYtjGuHBHKyPpR3ScTxzdkSYNvniwBfN7rUDbYiHu/UZiI1hvV2idJeUvktRnz29l7W9BnNLHrG6Q== - dependencies: - "@babel/runtime" "^7.13.16" - "@popperjs/core" "^2.10.1" - "@react-aria/ssr" "^3.0.1" - "@restart/hooks" "^0.4.0" - "@types/warning" "^3.0.0" - dequal "^2.0.2" - dom-helpers "^5.2.0" - prop-types "^15.7.2" - uncontrollable "^7.2.1" - warning "^4.0.3" - -"@rjsf/core@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@rjsf/core/-/core-4.0.1.tgz#3363aadbaf40f7086f8669c4a645ed0cddd6c2da" - integrity sha512-3HZ5Udy/Yvtixjn/dOcVm4IBoF/HM/LmUAPZt98elSAISga3vhzGc3zv7Fi3IbDNrvL6ZdJbfIj+BtR0q4Rnrg== - dependencies: - "@types/json-schema" "^7.0.7" - ajv "^6.7.0" - core-js-pure "^3.6.5" - json-schema-merge-allof "^0.6.0" - jsonpointer "^5.0.0" - lodash "^4.17.15" - nanoid "^3.1.23" - prop-types "^15.7.2" - react-is "^16.9.0" +"@popperjs/core@^2.11.5": + version "2.11.5" + resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.5.tgz#db5a11bf66bdab39569719555b0f76e138d7bd64" + integrity sha512-9X2obfABZuDVLCgPK9aX0a/x4jaOEweTTWE2+9sr0Qqqevj2Uv5XorvusThmc9XGYpS9yI+fhh8RTafBtGposw== "@rollup/plugin-replace@^4.0.0": version "4.0.0" @@ -375,146 +73,238 @@ estree-walker "^1.0.1" picomatch "^2.2.2" -"@rollup/pluginutils@^4.1.2": - version "4.1.2" - resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-4.1.2.tgz#ed5821c15e5e05e32816f5fb9ec607cdf5a75751" - integrity sha512-ROn4qvkxP9SyPeHaf7uQC/GPFY6L/OWy9+bd9AwcjOAWQwxRscoEyAUD8qCY5o5iL4jqQwoLk2kaTKJPb/HwzQ== +"@tauri-apps/api@^1.0.0-rc.3": + version "1.0.0-rc.3" + resolved "https://registry.yarnpkg.com/@tauri-apps/api/-/api-1.0.0-rc.3.tgz#e80ddbe832bf003537d94801d508a7f7e25ac48b" + integrity sha512-/ZbyBjuUoU6mYm8RzibIUvVuJ31ZwYA2+fTRl7FF4LVFhzCVJ1YI1BS5ohGb2GsLNmLpfeo7kDHaIhV2uaOchQ== dependencies: - estree-walker "^2.0.1" - picomatch "^2.2.2" + type-fest "2.12.1" -"@tauri-apps/api@^1.0.0-rc.1": - version "1.0.0-rc.1" - resolved "https://registry.yarnpkg.com/@tauri-apps/api/-/api-1.0.0-rc.1.tgz#ce26a0fe30d8980a4682d50015eec28ed4a23c1e" - integrity sha512-VBUOmfT8ea02JB/Qr+FHeaLnug5BRA7ro2pX47q0GZCbZsU9b+iPnOXl0ShJwT0melR7B6iamyhDwkHStMVfQA== - dependencies: - type-fest "2.11.2" +"@tauri-apps/cli-darwin-arm64@1.0.0-rc.8": + version "1.0.0-rc.8" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-1.0.0-rc.8.tgz#84eac830714d1819c72f4e3d7e334bee3719d673" + integrity sha512-sbV4fkd3YBlX0gEBldEVmN/NbBdHzrn8wCRRiFaNBocDWC6Ji6DNvpp1Vy1xgY0RgtGOisGD+3+HelmKP4Mh/A== -"@tauri-apps/cli-darwin-arm64@1.0.0-rc.5": - version "1.0.0-rc.5" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-1.0.0-rc.5.tgz#9374be8c96afa1cf77b5647bc81fe1a05006757d" - integrity sha512-X+3EIAUGfoL8uE6PBADZC8FcUISe4JPQCxXgaVv6ehoZGoCh/pFJF7AvBGTQxbnvngqM7Xce4Lmh63Io2/5ggw== +"@tauri-apps/cli-darwin-x64@1.0.0-rc.8": + version "1.0.0-rc.8" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-1.0.0-rc.8.tgz#675b8cdbf2a0ade23159e964ac3a1e5dd767ffcf" + integrity sha512-VmuYbBZKKal/YxSTbzHTaM04C9zUlTXq7ePoXc1PRAa/Xafo16N37OGzhzBlsKHrvh6BtPp9ZWk5UhHIDiJBsw== -"@tauri-apps/cli-darwin-x64@1.0.0-rc.5": - version "1.0.0-rc.5" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-1.0.0-rc.5.tgz#4db1dd56a228bfafe5b3f64c7661abbe5606e804" - integrity sha512-fEpgOdAvKdq9C5/yip8RnwP1VS+nRrtKdzzplu4jY6njDVH/Vom8mg+EfXkCY5RveCaoskJMFgUvt10IGeZHBA== +"@tauri-apps/cli-linux-arm-gnueabihf@1.0.0-rc.8": + version "1.0.0-rc.8" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-1.0.0-rc.8.tgz#b7ecece513c7ba828c0e794eca4f3125f83f2cf6" + integrity sha512-2VKkS1c2pK56sgtGxtsm9nKKWefG7dgPnynTuCoEngkgQfNIlZ1ns/eAIZpBmwhvOMOw2OesKvK9ZQo0/lE/IA== -"@tauri-apps/cli-linux-arm-gnueabihf@1.0.0-rc.5": - version "1.0.0-rc.5" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-1.0.0-rc.5.tgz#0f1ff84c534908a54fbe63b45004abc6d4f03f4d" - integrity sha512-V7sWSBrpLyvkQxpkHIM8JltYqQhiTpThySDjO8POtrTqkRwM5BXORcCYhxTAKCedecfYK/RNUJ6Q0t7+3jS6DQ== +"@tauri-apps/cli-linux-arm64-gnu@1.0.0-rc.8": + version "1.0.0-rc.8" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-1.0.0-rc.8.tgz#6c08741be40d0148da16b26d568c1595e3b99332" + integrity sha512-jykbrTJyx0uJhhL/3PPYGx5ETqEzacJ3YChnHzVClSzPkrdoGC61/xY9dMD9ZFJsLMJkV4VJj8sGRd1OPKCa/w== -"@tauri-apps/cli-linux-arm64-gnu@1.0.0-rc.5": - version "1.0.0-rc.5" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-1.0.0-rc.5.tgz#c5d2f1dd962d80a1958261229778b410b86254d4" - integrity sha512-HhM+2FInxtUAI/41LF4fDEzmhLQUq6DOoo7fLN94vgWlhsPyWZoDGP9pA043XbO86+4OX5JZUW1SnTVXMwEaMA== +"@tauri-apps/cli-linux-arm64-musl@1.0.0-rc.8": + version "1.0.0-rc.8" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.0.0-rc.8.tgz#70fdfbf5e4fe4d42bc5984a7bc8914d08a3dcbf6" + integrity sha512-HAIm8BKpLIWkvYgxoRzDIaqWIW3UtH2HO1qDd0aov5FTx/9dtCTtylpvd/6mWs5LGaEmsLoSokfJloI2sMZ/WQ== -"@tauri-apps/cli-linux-arm64-musl@1.0.0-rc.5": - version "1.0.0-rc.5" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.0.0-rc.5.tgz#f485db9ca5402f5d2c4585801a3aaa4519bd67e8" - integrity sha512-DhHdKOhf3+peA/sM0c9CpxK89cp8GVwOB5osFW55fxBZbD0mJFeL2SzjkgfGFqFu6Ci/ZiibQGfEp8XTC8OsYA== +"@tauri-apps/cli-linux-x64-gnu@1.0.0-rc.8": + version "1.0.0-rc.8" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-1.0.0-rc.8.tgz#bf21f03128e1d6f8ae4d4e043ac2620d8489a69d" + integrity sha512-fnPrkX6Uy9Qz2vqnT3D3sgbJzXTR4arNUIQl8HIYi2YCZZVmDWczz4x4++ilZWwk0I3a7d612/WzTeBzQjn3kg== -"@tauri-apps/cli-linux-x64-gnu@1.0.0-rc.5": - version "1.0.0-rc.5" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-1.0.0-rc.5.tgz#e468939585bc98e80ec827d0a3d8ba06a7cc38e8" - integrity sha512-pZzsOHRGG/mdcn7fF/yOIOdeVzGxZUtZqvlGSd90ZM9Ps3//uYGCBHoNTbeSwp/V6+D0KVDaSCbm9lYlHoXcdA== +"@tauri-apps/cli-linux-x64-musl@1.0.0-rc.8": + version "1.0.0-rc.8" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-1.0.0-rc.8.tgz#647286cb6826d0ff1503a9d6d88959ab8f5de4fb" + integrity sha512-kHrpBsJFRAwqFL7xnsrKdNxnYjzI/J9/Dr7T3rl+IIPbi1sIojh6DydxFOYepnuoINA6zWYQJpo0FQeASJsXrw== -"@tauri-apps/cli-linux-x64-musl@1.0.0-rc.5": - version "1.0.0-rc.5" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-1.0.0-rc.5.tgz#a1308e93850555f2b6c97b5d7cdbbb9afaa803e2" - integrity sha512-COwWCbOhEjBlzGRGTa0ESO4/AiC0cBZ2UEPExRn++S+kWSPJ2vsyMdCLu3hiMy1ABSIRcQ4Vc68M1iVkLhOHHw== +"@tauri-apps/cli-win32-ia32-msvc@1.0.0-rc.8": + version "1.0.0-rc.8" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-1.0.0-rc.8.tgz#69fff6f746631345649d2abf788e9f0954eb7ce8" + integrity sha512-y8uT7AaIZVdLAWL4pxj/GXitwWn828er23yniOvTo1mJMCZsSFdwiOGiRSXI6OZsVCOPiJmvqq7eWaskQKYA0A== -"@tauri-apps/cli-win32-x64-msvc@1.0.0-rc.5": - version "1.0.0-rc.5" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-1.0.0-rc.5.tgz#d15c95143d9123d10c510e28ba90df5349b68ecd" - integrity sha512-zzizUmPWvnWjj+IUCk36kVjS9j1Bg5JmnwOW5QdX26+a64q5vocmVimCgrfZ5STw3sDFXE++S55ghpzhhH5o+g== +"@tauri-apps/cli-win32-x64-msvc@1.0.0-rc.8": + version "1.0.0-rc.8" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-1.0.0-rc.8.tgz#bf58e24c42fccf098f78dc51e43f5cd7b7ff6842" + integrity sha512-PiDr/iAKoL9nQSiWHkUSjRVHbvCJaa7Xj3P9UnGkjJQ9LGTr7AYZdLk4zISegF+/fZnOmaqUdZW9yWPPyJAzPw== -"@tauri-apps/cli@^1.0.0-rc.5": - version "1.0.0-rc.5" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli/-/cli-1.0.0-rc.5.tgz#db8ca22c9f55f5400d1c6addd78ee1df5dc15a29" - integrity sha512-Q3D0R5YdZRA5EcL206hwwKCyXpet2mRDcfaRTU/IXwF73bS4AMja+JdAGfO2cyHuSvXd+b//Cgbei2zCG8M6hw== +"@tauri-apps/cli@^1.0.0-rc.8": + version "1.0.0-rc.8" + resolved "https://registry.yarnpkg.com/@tauri-apps/cli/-/cli-1.0.0-rc.8.tgz#ee8c9a587739853bd5f8a46a456a43ae594610f6" + integrity sha512-FWpNwbgGMPgDb41oO7wdBhBsBE6FMG9yHKbtbrkJ/8d/hWcT6e3UUTfFL9cR2VGdp1pdWlul5+BKH0PTf8rB9w== optionalDependencies: - "@tauri-apps/cli-darwin-arm64" "1.0.0-rc.5" - "@tauri-apps/cli-darwin-x64" "1.0.0-rc.5" - "@tauri-apps/cli-linux-arm-gnueabihf" "1.0.0-rc.5" - "@tauri-apps/cli-linux-arm64-gnu" "1.0.0-rc.5" - "@tauri-apps/cli-linux-arm64-musl" "1.0.0-rc.5" - "@tauri-apps/cli-linux-x64-gnu" "1.0.0-rc.5" - "@tauri-apps/cli-linux-x64-musl" "1.0.0-rc.5" - "@tauri-apps/cli-win32-x64-msvc" "1.0.0-rc.5" + "@tauri-apps/cli-darwin-arm64" "1.0.0-rc.8" + "@tauri-apps/cli-darwin-x64" "1.0.0-rc.8" + "@tauri-apps/cli-linux-arm-gnueabihf" "1.0.0-rc.8" + "@tauri-apps/cli-linux-arm64-gnu" "1.0.0-rc.8" + "@tauri-apps/cli-linux-arm64-musl" "1.0.0-rc.8" + "@tauri-apps/cli-linux-x64-gnu" "1.0.0-rc.8" + "@tauri-apps/cli-linux-x64-musl" "1.0.0-rc.8" + "@tauri-apps/cli-win32-ia32-msvc" "1.0.0-rc.8" + "@tauri-apps/cli-win32-x64-msvc" "1.0.0-rc.8" "@types/estree@0.0.39": version "0.0.39" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== -"@types/invariant@^2.2.33": - version "2.2.35" - resolved "https://registry.yarnpkg.com/@types/invariant/-/invariant-2.2.35.tgz#cd3ebf581a6557452735688d8daba6cf0bd5a3be" - integrity sha512-DxX1V9P8zdJPYQat1gHyY0xj3efl8gnMVjiM9iCY6y27lj+PoQWkgjt8jDqmovPqULkKVpKRg8J36iQiA+EtEg== - -"@types/json-schema@^7.0.7": - version "7.0.9" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" - integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== - -"@types/lodash@^4.14.179": - version "4.14.179" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.179.tgz#490ec3288088c91295780237d2497a3aa9dfb5c5" - integrity sha512-uwc1x90yCKqGcIOAT6DwOSuxnrAbpkdPsUOZtwrXb4D/6wZs+6qG7QnIawDuZWg0sWpxl+ltIKCaLoMlna678w== - -"@types/node@^17.0.21": - version "17.0.21" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.21.tgz#864b987c0c68d07b4345845c3e63b75edd143644" - integrity sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ== - -"@types/prop-types@*", "@types/prop-types@^15.7.3": - version "15.7.4" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.4.tgz#fcf7205c25dff795ee79af1e30da2c9790808f11" - integrity sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ== - -"@types/react-transition-group@^4.4.1": - version "4.4.4" - resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.4.tgz#acd4cceaa2be6b757db61ed7b432e103242d163e" - integrity sha512-7gAPz7anVK5xzbeQW9wFBDg7G++aPLAFY0QaSMOou9rJZpbuI58WAuJrgu+qR92l61grlnCUe7AFX8KGahAgug== +"@types/jest@^27.0.1": + version "27.4.1" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-27.4.1.tgz#185cbe2926eaaf9662d340cc02e548ce9e11ab6d" + integrity sha512-23iPJADSmicDVrWk+HT58LMJtzLAnB2AgIzplQuq/bSrGaxCrlvRFjGbXmamnnk/mAmCdLStiGqggu28ocUyiw== dependencies: - "@types/react" "*" + jest-matcher-utils "^27.0.0" + pretty-format "^27.0.0" -"@types/react@*", "@types/react@>=16.14.8", "@types/react@>=16.9.11": - version "17.0.39" - resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.39.tgz#d0f4cde092502a6db00a1cded6e6bf2abb7633ce" - integrity sha512-UVavlfAxDd/AgAacMa60Azl7ygyQNRwC/DsHZmKgNvPmRR5p70AJ5Q9EAmL2NWOJmeV+vVUI4IAP7GZrN8h8Ug== +"@types/lodash-es@^4.17.6": + version "4.17.6" + resolved "https://registry.yarnpkg.com/@types/lodash-es/-/lodash-es-4.17.6.tgz#c2ed4c8320ffa6f11b43eb89e9eaeec65966a0a0" + integrity sha512-R+zTeVUKDdfoRxpAryaQNRKk3105Rrgx2CFRClIgRGaqDTdjsm8h6IYA8ir584W3ePzkZfst5xIgDwYrlh9HLg== dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" - csstype "^3.0.2" + "@types/lodash" "*" -"@types/scheduler@*": - version "0.16.2" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" - integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== +"@types/lodash@*", "@types/lodash@^4.14.181": + version "4.14.182" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.182.tgz#05301a4d5e62963227eaafe0ce04dd77c54ea5c2" + integrity sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q== -"@types/warning@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/warning/-/warning-3.0.0.tgz#0d2501268ad8f9962b740d387c4654f5f8e23e52" - integrity sha1-DSUBJorY+ZYrdA04fEZU9fjiPlI= +"@types/node@~14.14.31": + version "14.14.45" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.45.tgz#ec2dfb5566ff814d061aef7e141575aedba245cf" + integrity sha512-DssMqTV9UnnoxDWu959sDLZzfvqCF0qDNRjaWeYSui9xkFe61kKo4l1TWNTQONpuXEm+gLMRvdlzvNHBamzmEw== -"@vitejs/plugin-react@^1.0.7": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-1.2.0.tgz#4cfb4c0475e93885e56d66ff15e12ef4c34b0af0" - integrity sha512-Rywwt0IXXg6yQ0hv3cMT3mtdDcGIw31mGaa+MMMAT651LhoXLF2yFy4LrakiTs7UKs7RPBo9eNgaS8pgl2A6Qw== +"@types/node@~17.0.5": + version "17.0.25" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.25.tgz#527051f3c2f77aa52e5dc74e45a3da5fb2301448" + integrity sha512-wANk6fBrUwdpY4isjWrKTufkrXdu1D2YHCot2fD/DfWxF5sMrVSA+KN7ydckvaTCh0HiqX9IVl0L5/ZoXg5M7w== + +"@vicons/carbon@^0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@vicons/carbon/-/carbon-0.12.0.tgz#dfcc5d6283662eccee55700b2d5c29e688a70f5a" + integrity sha512-kCOgr/ZOhZzoiFLJ8pwxMa2TMxrkCUOA22qExPabus35F4+USqzcsxaPoYtqRd9ROOYiHrSqwapak/ywF0D9bg== + +"@vicons/fa@^0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@vicons/fa/-/fa-0.12.0.tgz#a5f92db45990f8a47b5eeedcdb9b673f0dababc8" + integrity sha512-g2PIeJLsTHUjt6bK63LxqC0uYQB7iu+xViJOxvp1s8b9/akpXVPVWjDTTsP980/0KYyMMe4U7F/aUo7wY+MsXA== + +"@vicons/utils@^0.1.4": + version "0.1.4" + resolved "https://registry.yarnpkg.com/@vicons/utils/-/utils-0.1.4.tgz#accea9226ff0078ebd80d00dcb63ef5e74b210ff" + integrity sha512-OHI19qVNN6i+uPQ+Y3f2s0dUxwsYnOCcKBW7XOU4yXXO1aU3ZoKpblCc3+4N0qmgoJs5rWKRAaMisipqEXJwAg== dependencies: - "@babel/core" "^7.16.12" - "@babel/plugin-transform-react-jsx" "^7.16.7" - "@babel/plugin-transform-react-jsx-development" "^7.16.7" - "@babel/plugin-transform-react-jsx-self" "^7.16.7" - "@babel/plugin-transform-react-jsx-source" "^7.16.7" - "@rollup/pluginutils" "^4.1.2" - react-refresh "^0.11.0" - resolve "^1.22.0" + "@xicons/utils" "^0.1.4" -ajv@^6.7.0: +"@vitejs/plugin-vue@^2.3.1": + version "2.3.1" + resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue/-/plugin-vue-2.3.1.tgz#5f286b8d3515381c6d5c8fa8eee5e6335f727e14" + integrity sha512-YNzBt8+jt6bSwpt7LP890U1UcTOIZZxfpE5WOJ638PNxSEKOqAi0+FSKS0nVeukfdZ0Ai/H7AFd6k3hayfGZqQ== + +"@vue/compiler-core@3.2.33": + version "3.2.33" + resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.2.33.tgz#e915d59cce85898f5c5cfebe4c09e539278c3d59" + integrity sha512-AAmr52ji3Zhk7IKIuigX2osWWsb2nQE5xsdFYjdnmtQ4gymmqXbjLvkSE174+fF3A3kstYrTgGkqgOEbsdLDpw== + dependencies: + "@babel/parser" "^7.16.4" + "@vue/shared" "3.2.33" + estree-walker "^2.0.2" + source-map "^0.6.1" + +"@vue/compiler-dom@3.2.33": + version "3.2.33" + resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.2.33.tgz#6db84296f949f18e5d3e7fd5e80f943dbed7d5ec" + integrity sha512-GhiG1C8X98Xz9QUX/RlA6/kgPBWJkjq0Rq6//5XTAGSYrTMBgcLpP9+CnlUg1TFxnnCVughAG+KZl28XJqw8uQ== + dependencies: + "@vue/compiler-core" "3.2.33" + "@vue/shared" "3.2.33" + +"@vue/compiler-sfc@3.2.33": + version "3.2.33" + resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.2.33.tgz#7ce01dc947a8b76c099811dc6ca58494d4dc773d" + integrity sha512-H8D0WqagCr295pQjUYyO8P3IejM3vEzeCO1apzByAEaAR/WimhMYczHfZVvlCE/9yBaEu/eu9RdiWr0kF8b71Q== + dependencies: + "@babel/parser" "^7.16.4" + "@vue/compiler-core" "3.2.33" + "@vue/compiler-dom" "3.2.33" + "@vue/compiler-ssr" "3.2.33" + "@vue/reactivity-transform" "3.2.33" + "@vue/shared" "3.2.33" + estree-walker "^2.0.2" + magic-string "^0.25.7" + postcss "^8.1.10" + source-map "^0.6.1" + +"@vue/compiler-ssr@3.2.33": + version "3.2.33" + resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.2.33.tgz#3e820267e4eea48fde9519f006dedca3f5e42e71" + integrity sha512-XQh1Xdk3VquDpXsnoCd7JnMoWec9CfAzQDQsaMcSU79OrrO2PNR0ErlIjm/mGq3GmBfkQjzZACV+7GhfRB8xMQ== + dependencies: + "@vue/compiler-dom" "3.2.33" + "@vue/shared" "3.2.33" + +"@vue/devtools-api@^6.0.0": + version "6.1.4" + resolved "https://registry.yarnpkg.com/@vue/devtools-api/-/devtools-api-6.1.4.tgz#b4aec2f4b4599e11ba774a50c67fa378c9824e53" + integrity sha512-IiA0SvDrJEgXvVxjNkHPFfDx6SXw0b/TUkqMcDZWNg9fnCAHbTpoo59YfJ9QLFkwa3raau5vSlRVzMSLDnfdtQ== + +"@vue/reactivity-transform@3.2.33": + version "3.2.33" + resolved "https://registry.yarnpkg.com/@vue/reactivity-transform/-/reactivity-transform-3.2.33.tgz#286063f44ca56150ae9b52f8346a26e5913fa699" + integrity sha512-4UL5KOIvSQb254aqenW4q34qMXbfZcmEsV/yVidLUgvwYQQ/D21bGX3DlgPUGI3c4C+iOnNmDCkIxkILoX/Pyw== + dependencies: + "@babel/parser" "^7.16.4" + "@vue/compiler-core" "3.2.33" + "@vue/shared" "3.2.33" + estree-walker "^2.0.2" + magic-string "^0.25.7" + +"@vue/reactivity@3.2.33": + version "3.2.33" + resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.2.33.tgz#c84eedb5225138dbfc2472864c151d3efbb4b673" + integrity sha512-62Sq0mp9/0bLmDuxuLD5CIaMG2susFAGARLuZ/5jkU1FCf9EDbwUuF+BO8Ub3Rbodx0ziIecM/NsmyjardBxfQ== + dependencies: + "@vue/shared" "3.2.33" + +"@vue/runtime-core@3.2.33": + version "3.2.33" + resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.2.33.tgz#2df8907c85c37c3419fbd1bdf1a2df097fa40df2" + integrity sha512-N2D2vfaXsBPhzCV3JsXQa2NECjxP3eXgZlFqKh4tgakp3iX6LCGv76DLlc+IfFZq+TW10Y8QUfeihXOupJ1dGw== + dependencies: + "@vue/reactivity" "3.2.33" + "@vue/shared" "3.2.33" + +"@vue/runtime-dom@3.2.33": + version "3.2.33" + resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.2.33.tgz#123b8969247029ea0d9c1983676d4706a962d848" + integrity sha512-LSrJ6W7CZTSUygX5s8aFkraDWlO6K4geOwA3quFF2O+hC3QuAMZt/0Xb7JKE3C4JD4pFwCSO7oCrZmZ0BIJUnw== + dependencies: + "@vue/runtime-core" "3.2.33" + "@vue/shared" "3.2.33" + csstype "^2.6.8" + +"@vue/server-renderer@3.2.33": + version "3.2.33" + resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.2.33.tgz#4b45d6d2ae10ea4e3d2cf8e676804cf60f331979" + integrity sha512-4jpJHRD4ORv8PlbYi+/MfP8ec1okz6rybe36MdpkDrGIdEItHEUyaHSKvz+ptNEyQpALmmVfRteHkU9F8vxOew== + dependencies: + "@vue/compiler-ssr" "3.2.33" + "@vue/shared" "3.2.33" + +"@vue/shared@3.2.33": + version "3.2.33" + resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.2.33.tgz#69a8c99ceb37c1b031d5cc4aec2ff1dc77e1161e" + integrity sha512-UBc1Pg1T3yZ97vsA2ueER0F6GbJebLHYlEi4ou1H5YL4KWvMOOWwpYo9/QpWq93wxKG6Wo13IY74Hcn/f7c7Bg== + +"@xicons/utils@^0.1.4": + version "0.1.4" + resolved "https://registry.yarnpkg.com/@xicons/utils/-/utils-0.1.4.tgz#cece50613b34d4b4c71e73bb0be92981067e11e1" + integrity sha512-uXxKDLz9abr80yJC05XSTq6wlyFcdW+N/1IYJkeHjzzXVc4VQ0sEYMoMMTjAH7HQBOyOkzOB4pf5NGF72lwa8Q== + dependencies: + css-render "^0.13.2" + +ajv-i18n@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/ajv-i18n/-/ajv-i18n-4.2.0.tgz#d48750ba60e283b3dee31e3c22c8c9f7410e326f" + integrity sha512-v/ei2UkCEeuKNXh8RToiFsUclmU+G57LO1Oo22OagNMENIw+Yb8eMwvHu7Vn9fmkjJyv6XclhJ8TbuigSglPkg== + +ajv@^6.10.2: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -524,12 +314,22 @@ ajv@^6.7.0: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: - color-convert "^1.9.0" + color-convert "^2.0.1" + +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== anymatch@~3.1.2: version "3.1.2" @@ -539,11 +339,23 @@ anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" +async-validator@^4.0.7: + version "4.0.7" + resolved "https://registry.yarnpkg.com/async-validator/-/async-validator-4.0.7.tgz#034a0fd2103a6b2ebf010da75183bec299247afe" + integrity sha512-Pj2IR7u8hmUEDOwB++su6baaRi+QvsgajuFB9j95foM1N2gy5HM4z60hfusIO0fBPG5uLAEl6yCJr1jNSVugEQ== + binary-extensions@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== +bootstrap-vue-3@^0.1.10: + version "0.1.10" + resolved "https://registry.yarnpkg.com/bootstrap-vue-3/-/bootstrap-vue-3-0.1.10.tgz#45f2d5071c9a0af477bf14c662ba303e503e333b" + integrity sha512-r5zd5DIzclFpR16s6nwFRkZlrLoTANbZ9OWFFGoKLGcHOnL+WFuR8HULUB5QEyKdH5mf9ltTBCEsX/mFRq2S1w== + dependencies: + core-js "3.x.x" + bootstrap@^5.1.3: version "5.1.3" resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-5.1.3.tgz#ba081b0c130f810fa70900acbc1c6d3c28fa8f34" @@ -556,30 +368,13 @@ braces@~3.0.2: dependencies: fill-range "^7.0.1" -browserslist@^4.17.5: - version "4.19.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.19.3.tgz#29b7caad327ecf2859485f696f9604214bedd383" - integrity sha512-XK3X4xtKJ+Txj8G5c30B4gsm71s69lqXlkYui4s6EkKxuv49qjYlY6oVd+IFJ73d4YymtM3+djvvt/R/iJwwDg== +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: - caniuse-lite "^1.0.30001312" - electron-to-chromium "^1.4.71" - escalade "^3.1.1" - node-releases "^2.0.2" - picocolors "^1.0.0" - -caniuse-lite@^1.0.30001312: - version "1.0.30001312" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001312.tgz#e11eba4b87e24d22697dae05455d5aea28550d5f" - integrity sha512-Wiz1Psk2MEK0pX3rUzWaunLTZzqS2JYZFzNKqAiJGiuxIjRPLgV6+VDPOg6lQOUxmDwhTlh198JsTTi8Hzw6aQ== - -chalk@^2.0.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" + ansi-styles "^4.1.0" + supports-color "^7.1.0" "chokidar@>=3.0.0 <4.0.0": version "3.5.3" @@ -596,245 +391,217 @@ chalk@^2.0.0: optionalDependencies: fsevents "~2.3.2" -classnames@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.1.tgz#dfcfa3891e306ec1dad105d0e88f4417b8535e8e" - integrity sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA== - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: - color-name "1.1.3" + color-name "~1.1.4" -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - -compute-gcd@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/compute-gcd/-/compute-gcd-1.2.1.tgz#34d639f3825625e1357ce81f0e456a6249d8c77f" - integrity sha512-TwMbxBNz0l71+8Sc4czv13h4kEqnchV9igQZBi6QUaz09dnz13juGnnaWWJTRsP3brxOoxeB4SA2WELLw1hCtg== - dependencies: - validate.io-array "^1.0.3" - validate.io-function "^1.0.2" - validate.io-integer-array "^1.0.0" - -compute-lcm@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/compute-lcm/-/compute-lcm-1.1.2.tgz#9107c66b9dca28cefb22b4ab4545caac4034af23" - integrity sha512-OFNPdQAXnQhDSKioX8/XYT6sdUlXwpeMjfd6ApxMJfyZ4GxmLR1xvMERctlYhlHwIiz6CSpBc2+qYKjHGZw4TQ== - dependencies: - compute-gcd "^1.2.1" - validate.io-array "^1.0.3" - validate.io-function "^1.0.2" - validate.io-integer-array "^1.0.0" - -convert-source-map@^1.7.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" - integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== - dependencies: - safe-buffer "~5.1.1" +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== copy-text-to-clipboard@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/copy-text-to-clipboard/-/copy-text-to-clipboard-3.0.1.tgz#8cbf8f90e0a47f12e4a24743736265d157bce69c" integrity sha512-rvVsHrpFcL4F2P8ihsoLdFHmd404+CMg71S756oRSeQgqk51U3kicGdnvfkrxva0xXH92SjGS62B0XIJsbh+9Q== -core-js-pure@^3.6.5: - version "3.21.1" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.21.1.tgz#8c4d1e78839f5f46208de7230cebfb72bc3bdb51" - integrity sha512-12VZfFIu+wyVbBebyHmRTuEE/tZrB4tJToWcwAMcsp3h4+sHR+fMJWbKpYiCRWlhFBq+KNyO8rIV9rTkeVmznQ== +core-js@3.x.x: + version "3.22.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.22.1.tgz#1936e4f1da82675fe22ae10ee60ef638cd9752fd" + integrity sha512-l6CwCLq7XgITOQGhv1dIUmwCFoqFjyQ6zQHUCQlS0xKmb9d6OHIg8jDiEoswhaettT21BSF5qKr6kbvE+aKwxw== core-js@^3.11.0: - version "3.21.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.21.1.tgz#f2e0ddc1fc43da6f904706e8e955bc19d06a0d94" - integrity sha512-FRq5b/VMrWlrmCzwRrpDYNxyHP9BcAZC+xHJaqTgIE5091ZV1NTmyh0sGOg5XqpnHvR0svdy0sv1gWA1zmhxig== + version "3.22.2" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.22.2.tgz#3ea0a245b0895fa39d1faa15fe75d91ade504a01" + integrity sha512-Z5I2vzDnEIqO2YhELVMFcL1An2CIsFe9Q7byZhs8c/QxummxZlAHw33TUHbIte987LkisOgL0LwQ1P9D6VISnA== -csstype@^3.0.2: - version "3.0.10" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.10.tgz#2ad3a7bed70f35b965707c092e5f30b327c290e5" - integrity sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA== - -debug@^4.1.0: - version "4.3.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" - integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== +css-render@^0.13.2: + version "0.13.9" + resolved "https://registry.yarnpkg.com/css-render/-/css-render-0.13.9.tgz#56f28c180a83a10ec610a12a9ad9fec087ac9dc1" + integrity sha512-n3C4ZH59rveBrUlAD7n0Ze9/gUMKa4dlH1C9CWKpGcIHR/xRcIVXzBGy1iw8WWq2ySmn2/ZqOpySQNAK5Pb6sw== dependencies: - ms "2.1.2" + "@emotion/hash" "~0.8.0" + "@types/node" "~14.14.31" + csstype "~3.0.5" -decode-uri-component@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= - -dequal@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.2.tgz#85ca22025e3a87e65ef75a7a437b35284a7e319d" - integrity sha512-q9K8BlJVxK7hQYqa6XISGmBZbtQQWVXSrRrWreHC94rMt1QL/Impruc+7p2CYSYuVIUr+YCt6hjrs1kkdJRTug== - -dom-helpers@^5.0.1, dom-helpers@^5.2.0, dom-helpers@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" - integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== +css-render@^0.15.7, css-render@^0.15.9: + version "0.15.9" + resolved "https://registry.yarnpkg.com/css-render/-/css-render-0.15.9.tgz#1bf0d3fe4d1202a236c38f2e9cf7915c0f0c6751" + integrity sha512-FMVcWsVipKEBR/mVf1+pIjCRQdztILVKxbp8TN5/Vf0Q/fdTq0OIb8JRW/pk7PP1eeWnB/ejQ0MNBe7ELjLblg== dependencies: - "@babel/runtime" "^7.8.7" - csstype "^3.0.2" + "@emotion/hash" "~0.8.0" + "@types/node" "~17.0.5" + csstype "~3.0.5" -electron-to-chromium@^1.4.71: - version "1.4.73" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.73.tgz#422f6f514315bcace9615903e4a9b6b9fa283137" - integrity sha512-RlCffXkE/LliqfA5m29+dVDPB2r72y2D2egMMfIy3Le8ODrxjuZNVo4NIC2yPL01N4xb4nZQLwzi6Z5tGIGLnA== +csstype@^2.6.8: + version "2.6.20" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.20.tgz#9229c65ea0b260cf4d3d997cb06288e36a8d6dda" + integrity sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA== -esbuild-android-64@0.14.24: - version "0.14.24" - resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.14.24.tgz#d826ac29a9b983dc200a0ca407c34c64d2480b38" - integrity sha512-mbhO8NepmUZ84cP/axGR8IzH1Trth+uknEJzz36cZl8FfMA3ooaiBsMyzJ35s70QEAreiEt1XzltZ4pcfOsVUA== +csstype@~3.0.5: + version "3.0.11" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.11.tgz#d66700c5eacfac1940deb4e3ee5642792d85cd33" + integrity sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw== -esbuild-android-arm64@0.14.24: - version "0.14.24" - resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.24.tgz#f8aaf28dbd4d7b80d30b0323c7a645e3a12b5de9" - integrity sha512-wM3iuLZjaA9BhlMOH6mWvTGXwPJsLOuAbMkGiczSY+NLeG2WF1ouCcuhFz2jZCbnw9lnI30QWgzebNBQi9K8SA== +date-fns-tz@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/date-fns-tz/-/date-fns-tz-1.3.3.tgz#7884a4b3ed6cd95bfd81831d608e5ef8be500c86" + integrity sha512-Gks46gwbSauBQnV3Oofluj1wTm8J0tM7sbSJ9P+cJq/ZnTCpMohTKmmO5Tn+jQ7dyn0+b8G7cY4O2DZ5P/LXcA== -esbuild-darwin-64@0.14.24: - version "0.14.24" - resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.24.tgz#9f6e4b94066e9c5e521b19176a85edd7f94ac074" - integrity sha512-GDaCV5e9mdrJkrGT91W8WCqQ/+fvB/nsULIu4l7Ik7dlQd5uB4qeKRcFFl5Vz5ODK/C/UWZmKmMQWokZsLNWLQ== +date-fns@^2.28.0: + version "2.28.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.28.0.tgz#9570d656f5fc13143e50c975a3b6bbeb46cd08b2" + integrity sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw== -esbuild-darwin-arm64@0.14.24: - version "0.14.24" - resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.24.tgz#6b8ce7f2a3e1210cc672c73d658669e5f88b8efb" - integrity sha512-reU7/vEdXsg+zZWxKL/gaHsJkGMCC49Y4pqbsaBmx0YAF00K0+V7w5BHBF+iY5jvtJ1ZCYRHTN/iAbYVOnoV0w== +diff-sequences@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.5.1.tgz#eaecc0d327fd68c8d9672a1e64ab8dccb2ef5327" + integrity sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ== -esbuild-freebsd-64@0.14.24: - version "0.14.24" - resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.24.tgz#b586d8aa290bfcdf0aa73fdfcf64c092d49795f2" - integrity sha512-Mp35Rz/XoixG7Uka6l54hU/XUxAEwQozgKoHPusJzX+Fu1vANil0Ypos0RJkidu7skSkd0xisNIT+gtD36BxpA== +esbuild-android-64@0.14.36: + version "0.14.36" + resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.14.36.tgz#fc5f95ce78c8c3d790fa16bc71bd904f2bb42aa1" + integrity sha512-jwpBhF1jmo0tVCYC/ORzVN+hyVcNZUWuozGcLHfod0RJCedTDTvR4nwlTXdx1gtncDqjk33itjO+27OZHbiavw== -esbuild-freebsd-arm64@0.14.24: - version "0.14.24" - resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.24.tgz#4e7098de07791089b6ef6b4f17a8ce6124da7bec" - integrity sha512-+tf4a4zYaHP1XXPt286mxOc2bmj13K57GZYjqYz/G3c3sgNXa0JBkcPlUATIj96WfXhWM115n3nHe9wF88+ZGQ== +esbuild-android-arm64@0.14.36: + version "0.14.36" + resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.36.tgz#44356fbb9f8de82a5cdf11849e011dfb3ad0a8a8" + integrity sha512-/hYkyFe7x7Yapmfv4X/tBmyKnggUmdQmlvZ8ZlBnV4+PjisrEhAvC3yWpURuD9XoB8Wa1d5dGkTsF53pIvpjsg== -esbuild-linux-32@0.14.24: - version "0.14.24" - resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.24.tgz#afe7345f3e8ee58eede36c0254e128924680b305" - integrity sha512-8jMZErn5aLnlSQqzK365yoWRr67ZkGNcoTmk1CK5Bk1EB9g7uwCfdZsmWcclLWPGkIhMbdk4OvzQ+Wp0popwWA== +esbuild-darwin-64@0.14.36: + version "0.14.36" + resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.36.tgz#3d9324b21489c70141665c2e740d6e84f16f725d" + integrity sha512-kkl6qmV0dTpyIMKagluzYqlc1vO0ecgpviK/7jwPbRDEv5fejRTaBBEE2KxEQbTHcLhiiDbhG7d5UybZWo/1zQ== -esbuild-linux-64@0.14.24: - version "0.14.24" - resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.24.tgz#ce7b95e8ed96076dcb329d1d34e4b9ef084e02cf" - integrity sha512-D/JCsk9OY2IZj+fkU74pKD4rD2pjeiYUbze1cS5D6+U0pz8j71GjZY5UkfwHhBBbNyPe6DPCyex97txQUlHwWw== +esbuild-darwin-arm64@0.14.36: + version "0.14.36" + resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.36.tgz#2a8040c2e465131e5281034f3c72405e643cb7b2" + integrity sha512-q8fY4r2Sx6P0Pr3VUm//eFYKVk07C5MHcEinU1BjyFnuYz4IxR/03uBbDwluR6ILIHnZTE7AkTUWIdidRi1Jjw== -esbuild-linux-arm64@0.14.24: - version "0.14.24" - resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.24.tgz#f8aee4eb78309fd3c064e86393a698e33908e8ec" - integrity sha512-DypWEDQLE+PoHGMa4FLcmKvS+yQLsYlsN03R496rTpDOiVQGrRdo0LbYtf+uHpDxa1KRrHZsQim6n8m3VBHP6g== +esbuild-freebsd-64@0.14.36: + version "0.14.36" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.36.tgz#d82c387b4d01fe9e8631f97d41eb54f2dbeb68a3" + integrity sha512-Hn8AYuxXXRptybPqoMkga4HRFE7/XmhtlQjXFHoAIhKUPPMeJH35GYEUWGbjteai9FLFvBAjEAlwEtSGxnqWww== -esbuild-linux-arm@0.14.24: - version "0.14.24" - resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.24.tgz#eaccc0a4d7d17e7290e5b20c383e6969c6769bf7" - integrity sha512-N+vvGpJAUWv3j+YZGOMEtrHwrrSG582TuAThBwoRE7d2N4zFE2WQBCiSYaAVckMQhvMOPqnCdqeTDUse5nlKTw== +esbuild-freebsd-arm64@0.14.36: + version "0.14.36" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.36.tgz#e8ce2e6c697da6c7ecd0cc0ac821d47c5ab68529" + integrity sha512-S3C0attylLLRiCcHiJd036eDEMOY32+h8P+jJ3kTcfhJANNjP0TNBNL30TZmEdOSx/820HJFgRrqpNAvTbjnDA== -esbuild-linux-mips64le@0.14.24: - version "0.14.24" - resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.24.tgz#9db94b62bbcbaad6229087ea27a6d7dc3fc878d6" - integrity sha512-eMk9pEHba1yd5bOuPZUJfFucigvysdcE2d/wV4M0eUdb/VjyH9fcGqz8byvSjmYSOt3WCn/V4jLVI+pwDSHWYw== +esbuild-linux-32@0.14.36: + version "0.14.36" + resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.36.tgz#a4a261e2af91986ea62451f2db712a556cb38a15" + integrity sha512-Eh9OkyTrEZn9WGO4xkI3OPPpUX7p/3QYvdG0lL4rfr73Ap2HAr6D9lP59VMF64Ex01LhHSXwIsFG/8AQjh6eNw== -esbuild-linux-ppc64le@0.14.24: - version "0.14.24" - resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.24.tgz#194d59a5ebfcdbfc7e710d13893e6c62216baa77" - integrity sha512-4vQ/Y6EV5Z2BjO7RdpEyTCv702WmOPc95d2CbUcFvg78FpGQAmrbIrHXu/yX4+rdUU6vMNBn3M+7M7/lxmxjjg== +esbuild-linux-64@0.14.36: + version "0.14.36" + resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.36.tgz#4a9500f9197e2c8fcb884a511d2c9d4c2debde72" + integrity sha512-vFVFS5ve7PuwlfgoWNyRccGDi2QTNkQo/2k5U5ttVD0jRFaMlc8UQee708fOZA6zTCDy5RWsT5MJw3sl2X6KDg== -esbuild-linux-riscv64@0.14.24: - version "0.14.24" - resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.24.tgz#0d8cbbcd2f3b7cc4365ebc8fac8d00fdc95691d2" - integrity sha512-pAN9/+NZ487Wo9PmlOM6Ra95SrhG8JQw7fCgi3z7dUufwTApTNTPGs5UOMD4Bmorju+DeGb0f0GddLaeabvqDg== +esbuild-linux-arm64@0.14.36: + version "0.14.36" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.36.tgz#c91c21e25b315464bd7da867365dd1dae14ca176" + integrity sha512-24Vq1M7FdpSmaTYuu1w0Hdhiqkbto1I5Pjyi+4Cdw5fJKGlwQuw+hWynTcRI/cOZxBcBpP21gND7W27gHAiftw== -esbuild-linux-s390x@0.14.24: - version "0.14.24" - resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.24.tgz#460e726f5d827f1171f9eac8c9bbcad8e6574ec5" - integrity sha512-ZR+VMHP2WS3022x2sK/85cBfKGgPalIZzpquDWjra9nUb+WdEzuK9i9bRsstLmjIPs3uIkGfe6xXUh/7PNLllw== +esbuild-linux-arm@0.14.36: + version "0.14.36" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.36.tgz#90e23bca2e6e549affbbe994f80ba3bb6c4d934a" + integrity sha512-NhgU4n+NCsYgt7Hy61PCquEz5aevI6VjQvxwBxtxrooXsxt5b2xtOUXYZe04JxqQo+XZk3d1gcr7pbV9MAQ/Lg== -esbuild-netbsd-64@0.14.24: - version "0.14.24" - resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.24.tgz#8f6f4c68b8e84e1e011330096f118013cc275601" - integrity sha512-1PzXU++e0PEaSuGpkhrVb+fDUw9mSp4laY9KRsjJkAuXPDj0rHz7KxK7CAbzY/ucufeIR9Ca8/oMpdVyWdaOGw== +esbuild-linux-mips64le@0.14.36: + version "0.14.36" + resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.36.tgz#40e11afb08353ff24709fc89e4db0f866bc131d2" + integrity sha512-hZUeTXvppJN+5rEz2EjsOFM9F1bZt7/d2FUM1lmQo//rXh1RTFYzhC0txn7WV0/jCC7SvrGRaRz0NMsRPf8SIA== -esbuild-openbsd-64@0.14.24: - version "0.14.24" - resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.24.tgz#6fbfc089103d154d74d4ea5a3aefc2844189094a" - integrity sha512-PvXh7JJAFM1kR87XDWbRrUkaOGVMS6Dq/IRXE2E02maio21JELk/jNRijTe81ztr8v+8K9osB3rG9zKqIdTxhQ== +esbuild-linux-ppc64le@0.14.36: + version "0.14.36" + resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.36.tgz#9e8a588c513d06cc3859f9dcc52e5fdfce8a1a5e" + integrity sha512-1Bg3QgzZjO+QtPhP9VeIBhAduHEc2kzU43MzBnMwpLSZ890azr4/A9Dganun8nsqD/1TBcqhId0z4mFDO8FAvg== -esbuild-sunos-64@0.14.24: - version "0.14.24" - resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.24.tgz#09931dbbc610f88feda1c071f2844e7d8867f46e" - integrity sha512-5iYi76kGQdyCqvSUknqjTZ0T19KvQD6hiklPAY6kVoQ1YoDUGCGILRI9eM/3zLNLG1bUFgcdJ2ktaBxwyXuHyA== +esbuild-linux-riscv64@0.14.36: + version "0.14.36" + resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.36.tgz#e578c09b23b3b97652e60e3692bfda628b541f06" + integrity sha512-dOE5pt3cOdqEhaufDRzNCHf5BSwxgygVak9UR7PH7KPVHwSTDAZHDoEjblxLqjJYpc5XaU9+gKJ9F8mp9r5I4A== -esbuild-windows-32@0.14.24: - version "0.14.24" - resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.24.tgz#3c8dddffaec6dce9a3ac8ef2bec939ec5af17e68" - integrity sha512-oDxcNu4P1FWTk2ompKB0uKHfxYw1QuubH189+PlfrrWT9tVu+mxT9dSwJu2erfUDz5dnr6h8rgkg95NGboeJxg== +esbuild-linux-s390x@0.14.36: + version "0.14.36" + resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.36.tgz#3c9dab40d0d69932ffded0fd7317bb403626c9bc" + integrity sha512-g4FMdh//BBGTfVHjF6MO7Cz8gqRoDPzXWxRvWkJoGroKA18G9m0wddvPbEqcQf5Tbt2vSc1CIgag7cXwTmoTXg== -esbuild-windows-64@0.14.24: - version "0.14.24" - resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.24.tgz#e97081ee16d51c5a210cd1de15454689ac09fc8b" - integrity sha512-0uxXF1yLcGEM2es0OMDgQYQGZXQEEIdq8cG3IWhY2GGfFRLXpMgic1iUE+SKCh+b82t1ftUVoyG0zIFRn5NOIA== +esbuild-netbsd-64@0.14.36: + version "0.14.36" + resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.36.tgz#e27847f6d506218291619b8c1e121ecd97628494" + integrity sha512-UB2bVImxkWk4vjnP62ehFNZ73lQY1xcnL5ZNYF3x0AG+j8HgdkNF05v67YJdCIuUJpBuTyCK8LORCYo9onSW+A== -esbuild-windows-arm64@0.14.24: - version "0.14.24" - resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.24.tgz#0fcff2b58c772874f8dc52638557f817609ed699" - integrity sha512-unwaYRaIK/4OaZm0jnM3pLKMPEjaQqmT5teTciSZ86VYaiYZF27Ki7BW7R5ngk27gIw0ovIfUcn9DhJgp7qAlw== +esbuild-openbsd-64@0.14.36: + version "0.14.36" + resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.36.tgz#c94c04c557fae516872a586eae67423da6d2fabb" + integrity sha512-NvGB2Chf8GxuleXRGk8e9zD3aSdRO5kLt9coTQbCg7WMGXeX471sBgh4kSg8pjx0yTXRt0MlrUDnjVYnetyivg== -esbuild@^0.14.14: - version "0.14.24" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.24.tgz#543899cf9ff0ebe206dc3de2ac18b9122d9f5697" - integrity sha512-NjfmycVQqY0+iKXoHXsvMAKx4XF/bD/dDm8pK6C/3aJO/i/uby+7AR4z8vu0qkiihkB5Y43+9BjdY2MGnswC/A== +esbuild-sunos-64@0.14.36: + version "0.14.36" + resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.36.tgz#9b79febc0df65a30f1c9bd63047d1675511bf99d" + integrity sha512-VkUZS5ftTSjhRjuRLp+v78auMO3PZBXu6xl4ajomGenEm2/rGuWlhFSjB7YbBNErOchj51Jb2OK8lKAo8qdmsQ== + +esbuild-windows-32@0.14.36: + version "0.14.36" + resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.36.tgz#910d11936c8d2122ffdd3275e5b28d8a4e1240ec" + integrity sha512-bIar+A6hdytJjZrDxfMBUSEHHLfx3ynoEZXx/39nxy86pX/w249WZm8Bm0dtOAByAf4Z6qV0LsnTIJHiIqbw0w== + +esbuild-windows-64@0.14.36: + version "0.14.36" + resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.36.tgz#21b4ce8b42a4efc63f4b58ec617f1302448aad26" + integrity sha512-+p4MuRZekVChAeueT1Y9LGkxrT5x7YYJxYE8ZOTcEfeUUN43vktSn6hUNsvxzzATrSgq5QqRdllkVBxWZg7KqQ== + +esbuild-windows-arm64@0.14.36: + version "0.14.36" + resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.36.tgz#ba21546fecb7297667d0052d00150de22c044b24" + integrity sha512-fBB4WlDqV1m18EF/aheGYQkQZHfPHiHJSBYzXIo8yKehek+0BtBwo/4PNwKGJ5T0YK0oc8pBKjgwPbzSrPLb+Q== + +esbuild@^0.14.27: + version "0.14.36" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.36.tgz#0023a73eab57886ac5605df16ee421e471a971b3" + integrity sha512-HhFHPiRXGYOCRlrhpiVDYKcFJRdO0sBElZ668M4lh2ER0YgnkLxECuFe7uWCf23FrcLc59Pqr7dHkTqmRPDHmw== optionalDependencies: - esbuild-android-64 "0.14.24" - esbuild-android-arm64 "0.14.24" - esbuild-darwin-64 "0.14.24" - esbuild-darwin-arm64 "0.14.24" - esbuild-freebsd-64 "0.14.24" - esbuild-freebsd-arm64 "0.14.24" - esbuild-linux-32 "0.14.24" - esbuild-linux-64 "0.14.24" - esbuild-linux-arm "0.14.24" - esbuild-linux-arm64 "0.14.24" - esbuild-linux-mips64le "0.14.24" - esbuild-linux-ppc64le "0.14.24" - esbuild-linux-riscv64 "0.14.24" - esbuild-linux-s390x "0.14.24" - esbuild-netbsd-64 "0.14.24" - esbuild-openbsd-64 "0.14.24" - esbuild-sunos-64 "0.14.24" - esbuild-windows-32 "0.14.24" - esbuild-windows-64 "0.14.24" - esbuild-windows-arm64 "0.14.24" - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + esbuild-android-64 "0.14.36" + esbuild-android-arm64 "0.14.36" + esbuild-darwin-64 "0.14.36" + esbuild-darwin-arm64 "0.14.36" + esbuild-freebsd-64 "0.14.36" + esbuild-freebsd-arm64 "0.14.36" + esbuild-linux-32 "0.14.36" + esbuild-linux-64 "0.14.36" + esbuild-linux-arm "0.14.36" + esbuild-linux-arm64 "0.14.36" + esbuild-linux-mips64le "0.14.36" + esbuild-linux-ppc64le "0.14.36" + esbuild-linux-riscv64 "0.14.36" + esbuild-linux-s390x "0.14.36" + esbuild-netbsd-64 "0.14.36" + esbuild-openbsd-64 "0.14.36" + esbuild-sunos-64 "0.14.36" + esbuild-windows-32 "0.14.36" + esbuild-windows-64 "0.14.36" + esbuild-windows-arm64 "0.14.36" estree-walker@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700" integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== -estree-walker@^2.0.1: +estree-walker@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== +evtd@^0.2.2, evtd@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/evtd/-/evtd-0.2.3.tgz#185158d533b4440ee831a0fa0cffde16e8bda504" + integrity sha512-tmiT1YUVqFjTY+BSBOAskL83xNx41iUfpvKP6Gcd/xMHjg3mnER98jXGXJyKnxCG19uPc6EhZiUC+MUyvoqCtw== + fast-deep-equal@^3.1.1: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -852,11 +619,6 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" -filter-obj@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/filter-obj/-/filter-obj-1.1.0.tgz#9b311112bc6c6127a16e016c6c5d7f19e0805c5b" - integrity sha1-mzERErxsYSehbgFsbF1/GeCAXFs= - fsevents@~2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" @@ -867,11 +629,6 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" @@ -879,15 +636,10 @@ glob-parent@~5.1.2: dependencies: is-glob "^4.0.1" -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== has@^1.0.3: version "1.0.3" @@ -896,25 +648,16 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" -history@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/history/-/history-5.3.0.tgz#1548abaa245ba47992f063a0783db91ef201c73b" - integrity sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ== - dependencies: - "@babel/runtime" "^7.7.6" +highlight.js@^11.5.0: + version "11.5.1" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-11.5.1.tgz#027c24e4509e2f4dcd00b4a6dda542ce0a1f7aea" + integrity sha512-LKzHqnxr4CrD2YsNoIf/o5nJ09j4yi/GcH5BnYz9UnVpZdS4ucMgvP61TDty5xJcFGRjnH4DpujkS9bHT3hq0Q== immutable@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.0.0.tgz#b86f78de6adef3608395efb269a91462797e2c23" integrity sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw== -invariant@^2.2.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== - dependencies: - loose-envify "^1.0.0" - is-binary-path@~2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" @@ -946,92 +689,91 @@ is-number@^7.0.0: resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== +jest-diff@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.5.1.tgz#a07f5011ac9e6643cf8a95a462b7b1ecf6680def" + integrity sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw== + dependencies: + chalk "^4.0.0" + diff-sequences "^27.5.1" + jest-get-type "^27.5.1" + pretty-format "^27.5.1" + +jest-get-type@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.5.1.tgz#3cd613c507b0f7ace013df407a1c1cd578bcb4f1" + integrity sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw== + +jest-matcher-utils@^27.0.0: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz#9c0cdbda8245bc22d2331729d1091308b40cf8ab" + integrity sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw== + dependencies: + chalk "^4.0.0" + jest-diff "^27.5.1" + jest-get-type "^27.5.1" + pretty-format "^27.5.1" + js-base64@^3.7.2: version "3.7.2" resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-3.7.2.tgz#816d11d81a8aff241603d19ce5761e13e41d7745" integrity sha512-NnRs6dsyqUXejqk/yv2aiXlAvOs56sLkX6nUdeaNezI5LFFLlsZjOThmwnrcwh5ZZRwZlCMnVAY3CvhIhoVEKQ== -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -json-schema-compare@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/json-schema-compare/-/json-schema-compare-0.2.2.tgz#dd601508335a90c7f4cfadb6b2e397225c908e56" - integrity sha512-c4WYmDKyJXhs7WWvAWm3uIYnfyWFoIp+JEoX34rctVvEkMYCPGhXtvmFFXiffBbxfZsvQ0RNnV5H7GvDF5HCqQ== - dependencies: - lodash "^4.17.4" - -json-schema-merge-allof@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/json-schema-merge-allof/-/json-schema-merge-allof-0.6.0.tgz#64d48820fec26b228db837475ce3338936bf59a5" - integrity sha512-LEw4VMQVRceOPLuGRWcxW5orTTiR9ZAtqTAe4rQUjNADTeR81bezBVFa0MqIwp0YmHIM1KkhSjZM7o+IQhaPbQ== - dependencies: - compute-lcm "^1.1.0" - json-schema-compare "^0.2.2" - lodash "^4.17.4" - json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== -json5@^2.1.2: - version "2.2.0" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" - integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== - dependencies: - minimist "^1.2.5" +lodash-es@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" + integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== -jsonpointer@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.0.tgz#f802669a524ec4805fa7389eadbc9921d5dc8072" - integrity sha512-PNYZIdMjVIvVgDSYKTT63Y+KZ6IZvGRNNWcxwD+GNnUz1MKPfv30J8ueCjdwcN0nDx2SlshgyB7Oy0epAzVRRg== - -lodash@^4.17.15, lodash@^4.17.21, lodash@^4.17.4: +lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - magic-string@^0.25.7: - version "0.25.7" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051" - integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA== + version "0.25.9" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" + integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== dependencies: - sourcemap-codec "^1.4.4" - -minimist@^1.2.5: - version "1.2.6" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" - integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + sourcemap-codec "^1.4.8" mutation-observer@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/mutation-observer/-/mutation-observer-1.0.3.tgz#42e9222b101bca82e5ba9d5a7acf4a14c0f263d0" integrity sha512-M/O/4rF2h776hV7qGMZUH3utZLO/jK7p8rnNgGkjKUw8zCGjRQPxB8z6+5l8+VjRUQ3dNYu4vjqXYLr+U8ZVNA== -nanoid@^3.1.23, nanoid@^3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.1.tgz#6347a18cac88af88f58af0b3594b723d5e99bb35" - integrity sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw== +naive-ui@^2.28.1: + version "2.28.1" + resolved "https://registry.yarnpkg.com/naive-ui/-/naive-ui-2.28.1.tgz#73739f6bedfaf96a1cb47ed3ec87f5c96554c458" + integrity sha512-wgQ0uebfeZGmOkh2iKCDZI0ycK9IhGkkyfGPya6/Yfs9sDytloknh7Aapk1bhVe5uMsyMQyhHNQoByWgENdxbA== + dependencies: + "@css-render/plugin-bem" "^0.15.9" + "@css-render/vue3-ssr" "^0.15.9" + "@types/lodash" "^4.14.181" + "@types/lodash-es" "^4.17.6" + async-validator "^4.0.7" + css-render "^0.15.9" + date-fns "^2.28.0" + date-fns-tz "^1.3.3" + evtd "^0.2.3" + highlight.js "^11.5.0" + lodash "^4.17.21" + lodash-es "^4.17.21" + seemly "^0.3.3" + treemate "^0.3.11" + vdirs "^0.1.8" + vfonts "^0.0.3" + vooks "^0.2.12" + vueuc "^0.4.29" + +nanoid@^3.3.1: + version "3.3.3" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" + integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== node-fetch@2: version "2.6.7" @@ -1040,21 +782,11 @@ node-fetch@2: dependencies: whatwg-url "^5.0.0" -node-releases@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.2.tgz#7139fe71e2f4f11b47d4d2986aaf8c48699e0c01" - integrity sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg== - normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= - path-parse@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" @@ -1070,130 +802,33 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -postcss@^8.4.6: - version "8.4.7" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.7.tgz#f99862069ec4541de386bf57f5660a6c7a0875a8" - integrity sha512-L9Ye3r6hkkCeOETQX6iOaWZgjp3LL6Lpqm6EtgbKrgqGGteRMNb9vzBfRL96YOSu8o7x3MfIH9Mo5cPJFGrW6A== +postcss@^8.1.10, postcss@^8.4.12: + version "8.4.12" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.12.tgz#1e7de78733b28970fa4743f7da6f3763648b1905" + integrity sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg== dependencies: nanoid "^3.3.1" picocolors "^1.0.0" source-map-js "^1.0.2" -prop-types-extra@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/prop-types-extra/-/prop-types-extra-1.1.1.tgz#58c3b74cbfbb95d304625975aa2f0848329a010b" - integrity sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew== +pretty-format@^27.0.0, pretty-format@^27.5.1: + version "27.5.1" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" + integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== dependencies: - react-is "^16.3.2" - warning "^4.0.0" - -prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: - version "15.8.1" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" - integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== - dependencies: - loose-envify "^1.4.0" - object-assign "^4.1.1" - react-is "^16.13.1" + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^17.0.1" punycode@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -query-string@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-7.1.1.tgz#754620669db978625a90f635f12617c271a088e1" - integrity sha512-MplouLRDHBZSG9z7fpuAAcI7aAYjDLhtsiVZsevsfaHWDS2IDdORKbSd1kWUA+V4zyva/HZoSfpwnYMMQDhb0w== - dependencies: - decode-uri-component "^0.2.0" - filter-obj "^1.1.0" - split-on-first "^1.0.0" - strict-uri-encode "^2.0.0" - -react-bootstrap@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/react-bootstrap/-/react-bootstrap-2.1.2.tgz#a81161821c351d5e0eaed5bb85d50659736f2aa4" - integrity sha512-E7PR13cVsEW70gw08BWplENwn6PHTshskOsQygZqyc65jQlsnr9MsmuW/lgzAN2OiMBnc0KaNpuZ/FohL7dchw== - dependencies: - "@babel/runtime" "^7.14.0" - "@restart/hooks" "^0.4.5" - "@restart/ui" "^1.0.1" - "@types/invariant" "^2.2.33" - "@types/prop-types" "^15.7.3" - "@types/react" ">=16.14.8" - "@types/react-transition-group" "^4.4.1" - "@types/warning" "^3.0.0" - classnames "^2.3.1" - dom-helpers "^5.2.1" - invariant "^2.2.4" - prop-types "^15.7.2" - prop-types-extra "^1.1.0" - react-transition-group "^4.4.1" - uncontrollable "^7.2.1" - warning "^4.0.3" - -react-dom@^17.0.2: +react-is@^17.0.1: version "17.0.2" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" - integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - scheduler "^0.20.2" - -react-icons@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-4.3.1.tgz#2fa92aebbbc71f43d2db2ed1aed07361124e91ca" - integrity sha512-cB10MXLTs3gVuXimblAdI71jrJx8njrJZmNMEMC+sQu5B/BIOmlsAjskdqpn81y8UBVEGuHODd7/ci5DvoSzTQ== - -react-is@^16.13.1, react-is@^16.3.2, react-is@^16.9.0: - version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -react-lifecycles-compat@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" - integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== - -react-refresh@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.11.0.tgz#77198b944733f0f1f1a90e791de4541f9f074046" - integrity sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A== - -react-router-dom@^6.2.1: - version "6.2.2" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.2.2.tgz#f1a2c88365593c76b9612ae80154a13fcb72e442" - integrity sha512-AtYEsAST7bDD4dLSQHDnk/qxWLJdad5t1HFa1qJyUrCeGgEuCSw0VB/27ARbF9Fi/W5598ujvJOm3ujUCVzuYQ== - dependencies: - history "^5.2.0" - react-router "6.2.2" - -react-router@6.2.2, react-router@^6.2.1: - version "6.2.2" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.2.2.tgz#495e683a0c04461eeb3d705fe445d6cf42f0c249" - integrity sha512-/MbxyLzd7Q7amp4gDOGaYvXwhEojkJD5BtExkuKmj39VEE0m3l/zipf6h2WIB2jyAO0lI6NGETh4RDcktRm4AQ== - dependencies: - history "^5.2.0" - -react-transition-group@^4.4.1: - version "4.4.2" - resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.2.tgz#8b59a56f09ced7b55cbd53c36768b922890d5470" - integrity sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg== - dependencies: - "@babel/runtime" "^7.5.5" - dom-helpers "^5.0.1" - loose-envify "^1.4.0" - prop-types "^15.6.2" - -react@^17.0.2: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" - integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== readdirp@~3.6.0: version "3.6.0" @@ -1207,6 +842,11 @@ regenerator-runtime@^0.13.4: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== +resize-observer-polyfill@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" + integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg== + resolve@^1.22.0: version "1.22.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" @@ -1217,81 +857,55 @@ resolve@^1.22.0: supports-preserve-symlinks-flag "^1.0.0" rollup@^2.59.0: - version "2.69.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.69.0.tgz#82aa86682a45e9760146b736c1643bf435506156" - integrity sha512-kjER91tHyek8gAkuz7+558vSnTQ+pITEok1P0aNOS45ZXyngaqPsXJmSel4QPQnJo7EJMjXUU1/GErWkWiKORg== + version "2.70.2" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.70.2.tgz#808d206a8851628a065097b7ba2053bd83ba0c0d" + integrity sha512-EitogNZnfku65I1DD5Mxe8JYRUCy0hkK5X84IlDtUs+O6JRMpRciXTzyCUuX11b5L5pvjH+OmFXiQ3XjabcXgg== optionalDependencies: fsevents "~2.3.2" -safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -sass@^1.49.9: - version "1.49.9" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.49.9.tgz#b15a189ecb0ca9e24634bae5d1ebc191809712f9" - integrity sha512-YlYWkkHP9fbwaFRZQRXgDi3mXZShslVmmo+FVK3kHLUELHHEYrCmL1x6IUjC7wLS6VuJSAFXRQS/DxdsC4xL1A== +sass@^1.50.0: + version "1.50.0" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.50.0.tgz#3e407e2ebc53b12f1e35ce45efb226ea6063c7c8" + integrity sha512-cLsD6MEZ5URXHStxApajEh7gW189kkjn4Rc8DQweMyF+o5HF5nfEz8QYLMlPsTOD88DknatTmBWkOcw5/LnJLQ== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" source-map-js ">=0.6.2 <2.0.0" -scheduler@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" - integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== +seemly@^0.3.1, seemly@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/seemly/-/seemly-0.3.3.tgz#a6482f374e042f873f63dc7622cb1529c251574e" + integrity sha512-mAyqemz41e9HiZPMXAn7NtTExJgztwco5cdZjrt/iViU/oFeav+Q8K1c93M/tIZZ00QkT65JMr4xXQk7Vv5hWQ== dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - -semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + "@types/jest" "^27.0.1" "source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== -source-map@^0.5.0: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= +source-map@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -sourcemap-codec@^1.4.4: +sourcemap-codec@^1.4.8: version "1.4.8" resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== -split-on-first@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/split-on-first/-/split-on-first-1.1.0.tgz#f610afeee3b12bce1d0c30425e76398b78249a5f" - integrity sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw== - -strict-uri-encode@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" - integrity sha1-ucczDHBChi9rFC3CdLvMWGbONUY= - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: - has-flag "^3.0.0" + has-flag "^4.0.0" supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= - to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -1304,20 +918,15 @@ tr46@~0.0.3: resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= -type-fest@2.11.2: - version "2.11.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.11.2.tgz#5534a919858bc517492cd3a53a673835a76d2e71" - integrity sha512-reW2Y2Mpn0QNA/5fvtm5doROLwDPu2zOm5RtY7xQQS05Q7xgC8MOZ3yPNaP9m/s/sNjjFQtHo7VCNqYW2iI+Ig== +treemate@^0.3.11: + version "0.3.11" + resolved "https://registry.yarnpkg.com/treemate/-/treemate-0.3.11.tgz#7d52f8f69ab9ce326f8d139e0a3d1ffb25e48222" + integrity sha512-M8RGFoKtZ8dF+iwJfAJTOH/SM4KluKOKRJpjCMhI8bG3qB74zrFoArKZ62ll0Fr3mqkMJiQOmWYkdYgDeITYQg== -uncontrollable@^7.2.1: - version "7.2.1" - resolved "https://registry.yarnpkg.com/uncontrollable/-/uncontrollable-7.2.1.tgz#1fa70ba0c57a14d5f78905d533cf63916dc75738" - integrity sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ== - dependencies: - "@babel/runtime" "^7.6.3" - "@types/react" ">=16.9.11" - invariant "^2.2.4" - react-lifecycles-compat "^3.0.4" +type-fest@2.12.1: + version "2.12.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.12.1.tgz#d2be8f50bf5f8f0a5fd916d29bf3e98c17e960be" + integrity sha512-AiknQSEqKVGDDjtZqeKrUoTlcj7FKhupmnVUgz6KoOKtvMwRGE6hUNJ/nVear+h7fnUPO1q/htSkYKb1pyntkQ== uri-js@^4.2.2: version "4.4.1" @@ -1326,64 +935,77 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -validate.io-array@^1.0.3: - version "1.0.6" - resolved "https://registry.yarnpkg.com/validate.io-array/-/validate.io-array-1.0.6.tgz#5b5a2cafd8f8b85abb2f886ba153f2d93a27774d" - integrity sha1-W1osr9j4uFq7L4hroVPy2Tond00= - -validate.io-function@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/validate.io-function/-/validate.io-function-1.0.2.tgz#343a19802ed3b1968269c780e558e93411c0bad7" - integrity sha1-NDoZgC7TsZaCaceA5VjpNBHAutc= - -validate.io-integer-array@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/validate.io-integer-array/-/validate.io-integer-array-1.0.0.tgz#2cabde033293a6bcbe063feafe91eaf46b13a089" - integrity sha1-LKveAzKTpry+Bj/q/pHq9GsToIk= - dependencies: - validate.io-array "^1.0.3" - validate.io-integer "^1.0.4" - -validate.io-integer@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/validate.io-integer/-/validate.io-integer-1.0.5.tgz#168496480b95be2247ec443f2233de4f89878068" - integrity sha1-FoSWSAuVviJH7EQ/IjPeT4mHgGg= - dependencies: - validate.io-number "^1.0.3" - -validate.io-number@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/validate.io-number/-/validate.io-number-1.0.3.tgz#f63ffeda248bf28a67a8d48e0e3b461a1665baf8" - integrity sha1-9j/+2iSL8opnqNSODjtGGhZluvg= - -vconsole@^3.14.3: - version "3.14.3" - resolved "https://registry.yarnpkg.com/vconsole/-/vconsole-3.14.3.tgz#a452867f03b2eb1f57a3ce4b8ff2b0e067e92040" - integrity sha512-Je26lm4AzS8uGRVLvHRmCK2MoSDviM/z/kpM4RLGrbDzDB36stlMjmtOa3Vh9IQDQG/aw/gqQGtpSHIGEP7/og== +vconsole@^3.14.6: + version "3.14.6" + resolved "https://registry.yarnpkg.com/vconsole/-/vconsole-3.14.6.tgz#74cbbf9c14e66d26325958cee8a9e8c4086a5115" + integrity sha512-8Ffk2SfNe6EzKqZ0aNnNjpAVBVT7zgJo81lYEJdKySYLVYBeSawdSkWi9fSjDg3WsQhgS1vNPmRqJDTuwdVbnQ== dependencies: "@babel/runtime" "^7.17.2" copy-text-to-clipboard "^3.0.1" core-js "^3.11.0" mutation-observer "^1.0.3" -vite@^2.8.0: - version "2.8.6" - resolved "https://registry.yarnpkg.com/vite/-/vite-2.8.6.tgz#32d50e23c99ca31b26b8ccdc78b1d72d4d7323d3" - integrity sha512-e4H0QpludOVKkmOsRyqQ7LTcMUDF3mcgyNU4lmi0B5JUbe0ZxeBBl8VoZ8Y6Rfn9eFKYtdXNPcYK97ZwH+K2ug== +vdirs@^0.1.4, vdirs@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/vdirs/-/vdirs-0.1.8.tgz#a103bc43baca738f8dea912a7e9737154a19dbc2" + integrity sha512-H9V1zGRLQZg9b+GdMk8MXDN2Lva0zx72MPahDKc30v+DtwKjfyOSXWRIX4t2mhDubM1H09gPhWeth/BJWPHGUw== dependencies: - esbuild "^0.14.14" - postcss "^8.4.6" + evtd "^0.2.2" + +vfonts@^0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/vfonts/-/vfonts-0.0.3.tgz#999d66fecea18efee3f2b966c81101ae8ce01a29" + integrity sha512-nguyw8L6Un8eelg1vQ31vIU2ESxqid7EYmy8V+MDeMaHBqaRSkg3dTBToC1PR00D89UzS/SLkfYPnx0Wf23IQQ== + +vite@^2.9.2: + version "2.9.5" + resolved "https://registry.yarnpkg.com/vite/-/vite-2.9.5.tgz#08ef37ac7a6d879c96f328b791732c9a00ea25ea" + integrity sha512-dvMN64X2YEQgSXF1lYabKXw3BbN6e+BL67+P3Vy4MacnY+UzT1AfkHiioFSi9+uiDUiaDy7Ax/LQqivk6orilg== + dependencies: + esbuild "^0.14.27" + postcss "^8.4.12" resolve "^1.22.0" rollup "^2.59.0" optionalDependencies: fsevents "~2.3.2" -warning@^4.0.0, warning@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" - integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== +vooks@^0.2.12, vooks@^0.2.4: + version "0.2.12" + resolved "https://registry.yarnpkg.com/vooks/-/vooks-0.2.12.tgz#2b6e23330b77bac81c7f7a344c4ca3e9f4f6c373" + integrity sha512-iox0I3RZzxtKlcgYaStQYKEzWWGAduMmq+jS7OrNdQo1FgGfPMubGL3uGHOU9n97NIvfFDBGnpSvkWyb/NSn/Q== dependencies: - loose-envify "^1.0.0" + evtd "^0.2.2" + +vue-router@4: + version "4.0.14" + resolved "https://registry.yarnpkg.com/vue-router/-/vue-router-4.0.14.tgz#ce2028c1c5c33e30c7287950c973f397fce1bd65" + integrity sha512-wAO6zF9zxA3u+7AkMPqw9LjoUCjSxfFvINQj3E/DceTt6uEz1XZLraDhdg2EYmvVwTBSGlLYsUw8bDmx0754Mw== + dependencies: + "@vue/devtools-api" "^6.0.0" + +vue@^3.2.25: + version "3.2.33" + resolved "https://registry.yarnpkg.com/vue/-/vue-3.2.33.tgz#7867eb16a3293a28c4d190a837bc447878bd64c2" + integrity sha512-si1ExAlDUrLSIg/V7D/GgA4twJwfsfgG+t9w10z38HhL/HA07132pUQ2KuwAo8qbCyMJ9e6OqrmWrOCr+jW7ZQ== + dependencies: + "@vue/compiler-dom" "3.2.33" + "@vue/compiler-sfc" "3.2.33" + "@vue/runtime-dom" "3.2.33" + "@vue/server-renderer" "3.2.33" + "@vue/shared" "3.2.33" + +vueuc@^0.4.29: + version "0.4.29" + resolved "https://registry.yarnpkg.com/vueuc/-/vueuc-0.4.29.tgz#64ebba9e3dd6d6ad0ede5043c48d31631697346a" + integrity sha512-OlypOEll6YoTKnZx2aPml6orygNuzv+kwIztERzYiXPhCOE7/QMGQQek8NI/mDkb25vlglvm54n91ypYPMx8UQ== + dependencies: + "@css-render/vue3-ssr" "^0.15.7" + css-render "^0.15.7" + evtd "^0.2.2" + resize-observer-polyfill "^1.5.1" + seemly "^0.3.1" + vdirs "^0.1.4" + vooks "^0.2.4" webidl-conversions@^3.0.0: version "3.0.1" diff --git a/misc/config_tools/data/__init__.py b/misc/config_tools/data/__init__.py new file mode 100644 index 000000000..6bb846f9e --- /dev/null +++ b/misc/config_tools/data/__init__.py @@ -0,0 +1,3 @@ +# Do Not Delete +# This file be used in configurator's wasm python env +# See: https://stackoverflow.com/questions/42791179/why-does-pip-install-not-include-my-package-data-files diff --git a/misc/config_tools/launch_config/__init__.py b/misc/config_tools/launch_config/__init__.py new file mode 100644 index 000000000..6bb846f9e --- /dev/null +++ b/misc/config_tools/launch_config/__init__.py @@ -0,0 +1,3 @@ +# Do Not Delete +# This file be used in configurator's wasm python env +# See: https://stackoverflow.com/questions/42791179/why-does-pip-install-not-include-my-package-data-files diff --git a/misc/config_tools/launch_config/launch_cfg_gen.py b/misc/config_tools/launch_config/launch_cfg_gen.py index 6465924e6..e7ef2885a 100755 --- a/misc/config_tools/launch_config/launch_cfg_gen.py +++ b/misc/config_tools/launch_config/launch_cfg_gen.py @@ -5,19 +5,27 @@ # SPDX-License-Identifier: BSD-3-Clause # -import sys, os -import argparse -import lxml.etree as etree -import logging import re + +import os +import sys + import copy +import argparse + +import logging + +import lxml.etree as etree + def eval_xpath(element, xpath, default_value=None): return next(iter(element.xpath(xpath)), default_value) + def eval_xpath_all(element, xpath): return element.xpath(xpath) + class LaunchScript: script_template_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "launch_script_template.sh") @@ -30,7 +38,7 @@ class LaunchScript: # 31 - For LPC bridge needed by integrated GPU self._free_slots = list(range(3, 30)) - def get_virtual_bdf(self, device_etree = None, options = None): + def get_virtual_bdf(self, device_etree=None, options=None): if device_etree is not None: bus = eval_xpath(device_etree, "../@address") vendor_id = eval_xpath(device_etree, "vendor/text()") @@ -65,7 +73,7 @@ class LaunchScript: passthru_options = [] if device_etree is not None: class_code = eval_xpath(device_etree, "class/text()", "") - for k,v in self._options.items(): + for k, v in self._options.items(): if class_code.startswith(k): passthru_options.extend(v) return ",".join(passthru_options) @@ -157,7 +165,10 @@ class LaunchScript: self.add_dynamic_dm_parameter("add_virtual_device", f"{vbdf} {kind} {options}") def add_passthru_device(self, bus, dev, fun, options=""): - device_etree = eval_xpath(self._board_etree, f"//bus[@type='pci' and @address='0x{bus:x}']/device[@address='0x{(dev << 16) | fun:x}']") + device_etree = eval_xpath( + self._board_etree, + f"//bus[@type='pci' and @address='0x{bus:x}']/device[@address='0x{(dev << 16) | fun:x}']" + ) if not options: options = self._passthru_options.get_option(device_etree) @@ -176,6 +187,7 @@ class LaunchScript: except StopIteration: return False + def cpu_id_to_lapic_id(board_etree, vm_name, cpus): ret = [] @@ -188,6 +200,7 @@ def cpu_id_to_lapic_id(board_etree, vm_name, cpus): return ret + def generate_for_one_vm(board_etree, hv_scenario_etree, vm_scenario_etree, vm_id): vm_name = eval_xpath(vm_scenario_etree, "./name/text()", f"ACRN Post-Launched VM") script = LaunchScript(board_etree, vm_name, vm_scenario_etree) @@ -214,7 +227,7 @@ def generate_for_one_vm(board_etree, hv_scenario_etree, vm_scenario_etree, vm_id script.add_plain_dm_parameter(f"-m {eval_xpath(vm_scenario_etree, './/memory/size/text()')}M") if eval_xpath(vm_scenario_etree, "//SSRAM_ENABLED") == "y" and \ - eval_xpath(vm_scenario_etree, ".//vm_type/text()") == "RTVM": + eval_xpath(vm_scenario_etree, ".//vm_type/text()") == "RTVM": script.add_plain_dm_parameter("--ssram") ### @@ -314,10 +327,11 @@ def generate_for_one_vm(board_etree, hv_scenario_etree, vm_scenario_etree, vm_id bus = int(m.group(1), 16) dev = int(m.group(2), 16) func = int(m.group(3), 16) - device_node = eval_xpath(board_etree, f"//bus[@type='pci' and @address='{hex(bus)}']/device[@address='hex((dev << 16) | func)']") + device_node = eval_xpath(board_etree, + f"//bus[@type='pci' and @address='{hex(bus)}']/device[@address='hex((dev << 16) | func)']") if device_node and \ - eval_xpath(device_node, "class/text()") == "0x030000" and \ - eval_xpath(device_node, "resource[@type='memory'") is None: + eval_xpath(device_node, "class/text()") == "0x030000" and \ + eval_xpath(device_node, "resource[@type='memory'") is None: script.add_passthru_device(bus, dev, func, options="igd-vf") else: script.add_passthru_device(bus, dev, func) @@ -338,6 +352,7 @@ def generate_for_one_vm(board_etree, hv_scenario_etree, vm_scenario_etree, vm_id return script + def main(board_xml, scenario_xml, user_vm_id, out_dir): board_etree = etree.parse(board_xml) scenario_etree = etree.parse(scenario_xml) @@ -375,12 +390,14 @@ def main(board_xml, scenario_xml, user_vm_id, out_dir): return 0 + if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("--board", help="the XML file summarizing characteristics of the target board") parser.add_argument("--scenario", help="the XML file specifying the scenario to be set up") parser.add_argument("--launch", default=None, help="(obsoleted. DO NOT USE)") - parser.add_argument("--user_vmid", type=int, default=0, help="the post-launched VM ID (as is specified in the launch XML) whose launch script is to be generated, or 0 if all post-launched VMs shall be processed") + parser.add_argument("--user_vmid", type=int, default=0, + help="the post-launched VM ID (as is specified in the launch XML) whose launch script is to be generated, or 0 if all post-launched VMs shall be processed") parser.add_argument("--out", default="output", help="path to the directory where generated scripts are placed") args = parser.parse_args() diff --git a/misc/config_tools/scenario_config/jsonschema/converter.py b/misc/config_tools/scenario_config/jsonschema/converter.py index 991a43da2..1062af406 100644 --- a/misc/config_tools/scenario_config/jsonschema/converter.py +++ b/misc/config_tools/scenario_config/jsonschema/converter.py @@ -27,6 +27,7 @@ open(output_file, 'w', encoding='utf-8').write(json_schema) """ import os import json +import re from collections import OrderedDict from pathlib import Path @@ -109,9 +110,16 @@ class XS2JS: 'xs:maxInclusive': ('maximum', int), } - def __init__(self, schema_filename): + def __init__(self, schema_filename, features=None): self.xs = XS(schema_filename) self.desc_conv = ACRNDocumentStringConvertor() + if features is None: + self.features = [] + else: + if isinstance(features, list): + self.features = features + else: + self.features = [features] def _get_definitions(self): """convert xml schema types to json schema definitions""" @@ -192,6 +200,27 @@ class XS2JS: print(obj) raise NotImplementedError + def get_tester(self, element): + if "@test" not in element: + raise ValueError + test_command = re.search(r'\.//(\S+)\s*=\s*[\'"](\S+)[\'"]', element['@test']) + if not test_command: + raise ValueError + test_attr_name = test_command.group(1) + test_attr_const = test_command.group(2) + test_obj = { + "if": { + "properties": { + test_attr_name: { + "const": test_attr_const + } + } + }, + "then": True, + "else": False + } + return test_obj + def get_element_define(self, element): basic_define = {} if 'xs:simpleType' in element: @@ -204,6 +233,15 @@ class XS2JS: basic_define["$ref"] = "#/definitions/%s" % element_type elif 'xs:complexType' in element: basic_define = self.xse2jse(element['xs:complexType']) + elif 'xs:alternative' in element: + possible_types = [] + for possible_type in element['xs:alternative']: + temp_obj = self.get_element_define(possible_type) + if '@test' in possible_type: + temp_obj.update(self.get_tester(possible_type)) + possible_types.append(temp_obj) + + basic_define = {'oneOf': possible_types} else: print(json.dumps(element, indent=2)) raise NotImplementedError @@ -221,11 +259,8 @@ class XS2JS: name = element['@name'] # get element basic define (basic/simple type? $ref?) - try: - basic_define = self.get_element_define(element) - except NotImplementedError: - print(f"{name} not translated") - continue + + basic_define = self.get_element_define(element) # build element json schema js_ele = OrderedDict(basic_define) @@ -250,12 +285,16 @@ class XS2JS: required.append(name) if '@maxOccurs' in element: - if 'type' in js_ele: - js_ele['items'] = {'type': js_ele['type']} - elif '$ref' in js_ele: - js_ele['items'] = {'$ref': js_ele['$ref']} - del js_ele['$ref'] - else: + possible_keys = ['type', '$ref', 'oneOf'] + convert_to_items_success = False + for possible_key in possible_keys: + if possible_key not in js_ele: + continue + js_ele['items'] = {possible_key: js_ele[possible_key]} + del js_ele[possible_key] + convert_to_items_success = True + + if not convert_to_items_success: raise NotImplementedError if element['@maxOccurs'] == "unbounded": @@ -283,7 +322,7 @@ class XS2JS: js_ele['description'] = documentation # dynamic enum - if '@acrn:options' in element['xs:annotation']: + if '@acrn:options' in element['xs:annotation'] and 'dynamicEnum' in self.features: dynamic_enum = { 'type': 'dynamicEnum', 'function': 'get_enum', @@ -324,26 +363,22 @@ class XS2JS: return all_elements -def main(manual_call=False): - """ - if you call this function in your - module must set params `manual_call=True` - else this function will not run - """ - # for pyodide run check. - if __name__ != '__main__' and not manual_call: - return - +def main(): # find acrn-hypervisor/misc/config_tools folder config_tools = Path(__file__).absolute() while config_tools.name != "config_tools": config_tools = config_tools.parent - schema_file = config_tools / 'configurator' / 'build' / 'sliced.xsd' + schema_file = config_tools / 'schema' / 'sliced.xsd' json_schema_file = config_tools / 'configurator' / 'src' / 'assets' / 'schema' / 'scenario.json' # Convert XSD to JSON Schema - json_schema = XS2JS(schema_file).get_json_schema() + # Todo: turn off it + stand_json_schema = False + features = [] + if not stand_json_schema: + features.append('dynamicEnum') + json_schema = XS2JS(schema_file, features).get_json_schema() json_schema = json.dumps(json_schema, indent='\t') # Write file and print successful message @@ -351,5 +386,5 @@ def main(manual_call=False): print("File %s Convert Success. JSON Schema Write To: %s" % (repr(schema_file), repr(json_schema_file))) -# for pyodide -main() +if __name__ == '__main__': + main() diff --git a/misc/config_tools/scenario_config/jsonschema/document.py b/misc/config_tools/scenario_config/jsonschema/document.py index 2218777c5..fa0b14a5c 100644 --- a/misc/config_tools/scenario_config/jsonschema/document.py +++ b/misc/config_tools/scenario_config/jsonschema/document.py @@ -4,6 +4,7 @@ # # SPDX-License-Identifier: BSD-3-Clause # +# pyodide support status: Yes """ This program support run in pyodide env. In js side you can pass params by add follow code before this script. @@ -11,11 +12,8 @@ In js side you can pass params by add follow code before this script. params = "${Base64.encode(params)}" ``` """ - import re import sys -import json -import base64 from urllib.parse import urljoin from subprocess import check_output @@ -144,24 +142,10 @@ class ACRNDocumentStringConvertor: return fragment -doc_html = '' -if __name__ == '__main__': - WEB = False - if 'params' in globals(): - WEB = True - # noinspection PyUnboundLocalVariable,PyUnresolvedReferences - params_data = base64.b64decode(params) - params = json.loads(params_data) - else: - params = { - "text": open('configdoc.txt').read(), - "objectsInv": None - } - - print(params) +def main(): + params = { + "text": open('configdoc.txt').read(), + "objectsInv": None + } doc_html = ACRNDocumentStringConvertor(params['objectsInv']).convert(params['text']) - if not WEB: - print(doc_html) - -# for pyodide -(lambda x: x)(doc_html) + return doc_html diff --git a/misc/config_tools/scenario_config/schema_slicer.py b/misc/config_tools/scenario_config/schema_slicer.py index e0572c097..26f29fed8 100755 --- a/misc/config_tools/scenario_config/schema_slicer.py +++ b/misc/config_tools/scenario_config/schema_slicer.py @@ -241,12 +241,9 @@ if __name__ == "__main__": # abs __file__ path to ignore `__file__ == 'schema_slicer.py'` issue config_tools_dir = os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)), "..")) schema_dir = os.path.join(config_tools_dir, "schema") - configurator_build_dir = os.path.join(config_tools_dir, 'configurator', 'build') - if not os.path.isdir(configurator_build_dir): - os.mkdir(configurator_build_dir) parser = argparse.ArgumentParser(description="Slice a given scenario schema by VM types and views") - parser.add_argument("out", nargs="?", default=os.path.join(configurator_build_dir, "sliced.xsd"), help="Path where the output is placed") + parser.add_argument("out", nargs="?", default=os.path.join(schema_dir, "sliced.xsd"), help="Path where the output is placed") parser.add_argument("--schema", default=os.path.join(schema_dir, "config.xsd"), help="the XML schema that defines the syntax of scenario XMLs") args = parser.parse_args() diff --git a/misc/config_tools/schema/__init__.py b/misc/config_tools/schema/__init__.py new file mode 100644 index 000000000..6bb846f9e --- /dev/null +++ b/misc/config_tools/schema/__init__.py @@ -0,0 +1,3 @@ +# Do Not Delete +# This file be used in configurator's wasm python env +# See: https://stackoverflow.com/questions/42791179/why-does-pip-install-not-include-my-package-data-files diff --git a/misc/config_tools/schema/config.xsd b/misc/config_tools/schema/config.xsd index da7b07dec..4b2bea796 100644 --- a/misc/config_tools/schema/config.xsd +++ b/misc/config_tools/schema/config.xsd @@ -1,6 +1,6 @@ diff --git a/misc/config_tools/setup.cfg b/misc/config_tools/setup.cfg index 7408d88ea..287e3ba5a 100644 --- a/misc/config_tools/setup.cfg +++ b/misc/config_tools/setup.cfg @@ -19,7 +19,14 @@ classifiers = package_dir = = . packages = find: +include_package_data = True python_requires = >=3.6 [options.packages.find] where = . + +[options.package_data] +schema = *, */*, */*/*, */*/*/*, */*/*/*/* +launch_config = *, */*, */*/*, */*/*/*, */*/*/*/* +data = *, */*, */*/*, */*/*/*, */*/*/*/* +configurator = src/assets/schema/scenario.json diff --git a/misc/packaging/gen_acrn_deb.py b/misc/packaging/gen_acrn_deb.py index bb1bbd4a5..ce3826342 100644 --- a/misc/packaging/gen_acrn_deb.py +++ b/misc/packaging/gen_acrn_deb.py @@ -193,7 +193,8 @@ def create_configurator_deb(build_dir): # get folder path project_base = Path(__file__).parent.parent.parent - configurator_path = Path(__file__).parent.parent / 'config_tools' / 'configurator' + config_tools_path = Path(__file__).parent.parent / 'config_tools' + configurator_path = config_tools_path / 'configurator' scenario_config_path = project_base / "misc" / "config_tools" / "scenario_config" deb_dir = configurator_path / 'src-tauri' / 'target' / 'release' / 'bundle' / 'deb' @@ -204,6 +205,8 @@ def create_configurator_deb(build_dir): # build command, if you update this, please update misc/config_tools/configurator/README.md#L55 add_cmd_list(cmd_list, 'python3 schema_slicer.py', scenario_config_path) add_cmd_list(cmd_list, 'python3 converter.py', scenario_config_path / "jsonschema") + add_cmd_list(cmd_list, 'python3 -m build', config_tools_path) + add_cmd_list(cmd_list, 'python3 thirdLib/manager.py install', configurator_path) add_cmd_list(cmd_list, 'yarn', configurator_path) add_cmd_list(cmd_list, 'yarn build', configurator_path) run_cmd_list(cmd_list)