diff options
| -rw-r--r-- | .github/workflows/build.yml | 5 | ||||
| -rw-r--r-- | .gitignore | 7 | ||||
| -rw-r--r-- | buildSrc/build.gradle.kts | 3 | ||||
| -rw-r--r-- | buildSrc/src/main/kotlin/quarkus-conventions.gradle.kts | 5 | ||||
| -rw-r--r-- | docker-compose.override.yml | 9 | ||||
| -rw-r--r-- | docker-compose.yml | 15 | ||||
| -rw-r--r-- | gradle/libs.versions.toml | 21 | ||||
| -rw-r--r-- | opendc-web/opendc-web-proto/build.gradle.kts | 9 | ||||
| -rw-r--r-- | opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/JobState.java (renamed from opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/JobState.kt) | 8 | ||||
| -rw-r--r-- | opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/OperationalPhenomena.java (renamed from opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/OperationalPhenomena.kt) | 9 | ||||
| -rw-r--r-- | opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/ProtocolError.java (renamed from opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/ProtocolError.kt) | 6 | ||||
| -rw-r--r-- | opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/Targets.java (renamed from opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/Targets.kt) | 13 | ||||
| -rw-r--r-- | opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/Trace.java (renamed from opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/Trace.kt) | 10 | ||||
| -rw-r--r-- | opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/Workload.java (renamed from opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/Workload.kt) | 21 | ||||
| -rw-r--r-- | opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/runner/Job.java (renamed from opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/runner/Job.kt) | 36 | ||||
| -rw-r--r-- | opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/runner/JobService.java | 60 | ||||
| -rw-r--r-- | opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/runner/Portfolio.java (renamed from opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/runner/Portfolio.kt) | 18 | ||||
| -rw-r--r-- | opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/runner/Scenario.java (renamed from opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/runner/Scenario.kt) | 31 | ||||
| -rw-r--r-- | opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/runner/Topology.java (renamed from opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/runner/Topology.kt) | 20 | ||||
| -rw-r--r-- | opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/topology/Machine.java | 38 | ||||
| -rw-r--r-- | opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/topology/MemoryUnit.java (renamed from opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/MemoryUnit.kt) | 12 | ||||
| -rw-r--r-- | opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/topology/ProcessingUnit.java | 29 | ||||
| -rw-r--r-- | opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/topology/Rack.java (renamed from opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/Rack.kt) | 14 | ||||
| -rw-r--r-- | opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/topology/Room.java (renamed from opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/Room.kt) | 13 | ||||
| -rw-r--r-- | opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/topology/RoomTile.java | 28 | ||||
| -rw-r--r-- | opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/user/Job.java (renamed from opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/ProcessingUnit.kt) | 20 | ||||
| -rw-r--r-- | opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/user/Portfolio.java (renamed from opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/user/Portfolio.kt) | 34 | ||||
| -rw-r--r-- | opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/user/Project.java (renamed from opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/user/Project.kt) | 22 | ||||
| -rw-r--r-- | opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/user/ProjectRole.java (renamed from opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/user/ProjectRole.kt) | 6 | ||||
| -rw-r--r-- | opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/user/Scenario.java (renamed from opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/user/Scenario.kt) | 71 | ||||
| -rw-r--r-- | opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/user/Topology.java (renamed from opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/user/Topology.kt) | 40 | ||||
| -rw-r--r-- | opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/user/User.java (renamed from opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/user/User.kt) | 9 | ||||
| -rw-r--r-- | opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/user/UserAccounting.java (renamed from opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/user/UserAccounting.kt) | 12 | ||||
| -rw-r--r-- | opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/RoomTile.kt | 34 | ||||
| -rw-r--r-- | opendc-web/opendc-web-proto/src/main/resources/META-INF/beans.xml | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-quarkus-deployment/build.gradle.kts (renamed from opendc-web/opendc-web-ui-quarkus-deployment/build.gradle.kts) | 5 | ||||
| -rw-r--r-- | opendc-web/opendc-web-quarkus-deployment/src/main/java/org/opendc/web/quarkus/deployment/runner/OpenDCRunnerBuildItem.java (renamed from opendc-web/opendc-web-runner-quarkus-deployment/src/main/java/org/opendc/web/runner/deployment/OpenDCRunnerBuildItem.java) | 4 | ||||
| -rw-r--r-- | opendc-web/opendc-web-quarkus-deployment/src/main/java/org/opendc/web/quarkus/deployment/runner/OpenDCRunnerConfig.java (renamed from opendc-web/opendc-web-runner-quarkus-deployment/src/main/java/org/opendc/web/runner/deployment/OpenDCRunnerConfig.java) | 4 | ||||
| -rw-r--r-- | opendc-web/opendc-web-quarkus-deployment/src/main/java/org/opendc/web/quarkus/deployment/runner/OpenDCRunnerProcessor.java (renamed from opendc-web/opendc-web-runner-quarkus-deployment/src/main/java/org/opendc/web/runner/deployment/OpenDCRunnerProcessor.java) | 8 | ||||
| -rw-r--r-- | opendc-web/opendc-web-quarkus-deployment/src/main/java/org/opendc/web/quarkus/deployment/ui/NextRouteManifestBuildItem.java (renamed from opendc-web/opendc-web-ui-quarkus-deployment/src/main/java/org/opendc/web/ui/deployment/OpenDCUiRoutingBuildItem.java) | 70 | ||||
| -rw-r--r-- | opendc-web/opendc-web-quarkus-deployment/src/main/java/org/opendc/web/quarkus/deployment/ui/OpenDCUiProcessor.java | 57 | ||||
| -rw-r--r-- | opendc-web/opendc-web-quarkus-deployment/src/main/java/org/opendc/web/quarkus/deployment/ui/QuinoaNextRoutingProcessor.java | 154 | ||||
| -rw-r--r-- | opendc-web/opendc-web-quarkus/build.gradle.kts (renamed from opendc-web/opendc-web-ui-quarkus/build.gradle.kts) | 6 | ||||
| -rw-r--r-- | opendc-web/opendc-web-quarkus/src/main/java/org/opendc/web/quarkus/runtime/runner/OpenDCRunnerRecorder.java (renamed from opendc-web/opendc-web-runner-quarkus/src/main/java/org/opendc/web/runner/runtime/OpenDCRunnerRecorder.java) | 4 | ||||
| -rw-r--r-- | opendc-web/opendc-web-quarkus/src/main/java/org/opendc/web/quarkus/runtime/runner/OpenDCRunnerRuntimeConfig.java (renamed from opendc-web/opendc-web-runner-quarkus/src/main/java/org/opendc/web/runner/runtime/OpenDCRunnerRuntimeConfig.java) | 4 | ||||
| -rw-r--r-- | opendc-web/opendc-web-quarkus/src/main/java/org/opendc/web/quarkus/runtime/ui/AuthConfiguration.java (renamed from opendc-web/opendc-web-ui-quarkus-deployment/src/main/java/org/opendc/web/ui/deployment/AuthConfiguration.java) | 4 | ||||
| -rw-r--r-- | opendc-web/opendc-web-quarkus/src/main/java/org/opendc/web/quarkus/runtime/ui/OpenDCUiConfig.java (renamed from opendc-web/opendc-web-ui-quarkus-deployment/src/main/java/org/opendc/web/ui/deployment/OpenDCUiConfig.java) | 15 | ||||
| -rw-r--r-- | opendc-web/opendc-web-quarkus/src/main/java/org/opendc/web/quarkus/runtime/ui/OpenDCUiRecorder.java | 76 | ||||
| -rw-r--r-- | opendc-web/opendc-web-quarkus/src/main/java/org/opendc/web/quarkus/runtime/ui/QuinoaNextRoutingRecorder.java (renamed from opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/error/MissingKotlinParameterExceptionMapper.java) | 45 | ||||
| -rw-r--r-- | opendc-web/opendc-web-quarkus/src/main/resources/META-INF/quarkus-extension.yaml (renamed from opendc-web/opendc-web-ui-quarkus/src/main/resources/META-INF/quarkus-extension.yaml) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-runner-quarkus-deployment/build.gradle.kts | 37 | ||||
| -rw-r--r-- | opendc-web/opendc-web-runner-quarkus/build.gradle.kts | 47 | ||||
| -rw-r--r-- | opendc-web/opendc-web-runner-quarkus/src/main/resources/META-INF/quarkus-extension.yaml | 5 | ||||
| -rw-r--r-- | opendc-web/opendc-web-runner/Dockerfile | 3 | ||||
| -rw-r--r-- | opendc-web/opendc-web-runner/src/main/kotlin/org/opendc/web/runner/internal/JobManagerImpl.kt | 8 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/Dockerfile | 7 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/build.gradle.kts | 11 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Job.java | 11 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Portfolio.java | 1 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Project.java | 4 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/ProjectAuthorization.java | 38 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Scenario.java | 18 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Topology.java | 5 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/runner/JobResource.java | 2 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/PortfolioResource.java | 2 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/PortfolioScenarioResource.java | 14 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/ProjectResource.java | 2 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/TopologyResource.java | 4 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/resources/application-dev.properties | 10 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/resources/application-docker.properties | 11 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/resources/application.properties | 3 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/resources/load_data.sql | 58 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/.dockerignore (renamed from opendc-web/opendc-web-ui/.dockerignore) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/.eslintrc (renamed from opendc-web/opendc-web-ui/.eslintrc) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/.gitignore (renamed from opendc-web/opendc-web-ui/.gitignore) | 1 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/.prettierrc.yaml (renamed from opendc-web/opendc-web-ui/.prettierrc.yaml) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/Dockerfile (renamed from opendc-web/opendc-web-ui/Dockerfile) | 15 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/README.md (renamed from opendc-web/opendc-web-ui/README.md) | 6 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/api/index.js (renamed from opendc-web/opendc-web-ui/src/api/index.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/api/portfolios.js (renamed from opendc-web/opendc-web-ui/src/api/portfolios.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/api/projects.js (renamed from opendc-web/opendc-web-ui/src/api/projects.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/api/scenarios.js (renamed from opendc-web/opendc-web-ui/src/api/scenarios.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/api/schedulers.js (renamed from opendc-web/opendc-web-ui/src/api/schedulers.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/api/topologies.js (renamed from opendc-web/opendc-web-ui/src/api/topologies.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/api/traces.js (renamed from opendc-web/opendc-web-ui/src/api/traces.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/api/users.js (renamed from opendc-web/opendc-web-ui/src/api/users.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/auth.js (renamed from opendc-web/opendc-web-ui/src/auth.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/AppHeader.js (renamed from opendc-web/opendc-web-ui/src/components/AppHeader.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/AppHeader.module.css (renamed from opendc-web/opendc-web-ui/src/components/AppHeader.module.css) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/AppHeaderTools.js (renamed from opendc-web/opendc-web-ui/src/components/AppHeaderTools.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/AppHeaderUser.js (renamed from opendc-web/opendc-web-ui/src/components/AppHeaderUser.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/AppPage.js (renamed from opendc-web/opendc-web-ui/src/components/AppPage.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/context/ContextSelectionSection.js (renamed from opendc-web/opendc-web-ui/src/components/context/ContextSelectionSection.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/context/ContextSelectionSection.module.css (renamed from opendc-web/opendc-web-ui/src/components/context/ContextSelectionSection.module.css) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/context/ContextSelector.js (renamed from opendc-web/opendc-web-ui/src/components/context/ContextSelector.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/context/ContextSelector.module.css (renamed from opendc-web/opendc-web-ui/src/components/context/ContextSelector.module.css) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/context/PortfolioSelector.js (renamed from opendc-web/opendc-web-ui/src/components/context/PortfolioSelector.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/context/ProjectSelector.js (renamed from opendc-web/opendc-web-ui/src/components/context/ProjectSelector.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/context/TopologySelector.js (renamed from opendc-web/opendc-web-ui/src/components/context/TopologySelector.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/portfolios/NewScenario.js (renamed from opendc-web/opendc-web-ui/src/components/portfolios/NewScenario.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/portfolios/NewScenarioModal.js (renamed from opendc-web/opendc-web-ui/src/components/portfolios/NewScenarioModal.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/portfolios/PortfolioOverview.js (renamed from opendc-web/opendc-web-ui/src/components/portfolios/PortfolioOverview.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/portfolios/PortfolioResultInfo.js (renamed from opendc-web/opendc-web-ui/src/components/portfolios/PortfolioResultInfo.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/portfolios/PortfolioResults.js (renamed from opendc-web/opendc-web-ui/src/components/portfolios/PortfolioResults.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/portfolios/ScenarioState.js (renamed from opendc-web/opendc-web-ui/src/components/portfolios/ScenarioState.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/portfolios/ScenarioTable.js (renamed from opendc-web/opendc-web-ui/src/components/portfolios/ScenarioTable.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/projects/FilterPanel.js (renamed from opendc-web/opendc-web-ui/src/components/projects/FilterPanel.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/projects/FilterPanel.module.css (renamed from opendc-web/opendc-web-ui/src/components/projects/FilterPanel.module.css) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/projects/NewPortfolio.js (renamed from opendc-web/opendc-web-ui/src/components/projects/NewPortfolio.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/projects/NewPortfolioModal.js (renamed from opendc-web/opendc-web-ui/src/components/projects/NewPortfolioModal.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/projects/NewTopology.js (renamed from opendc-web/opendc-web-ui/src/components/projects/NewTopology.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/projects/NewTopologyModal.js (renamed from opendc-web/opendc-web-ui/src/components/projects/NewTopologyModal.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/projects/PortfolioTable.js (renamed from opendc-web/opendc-web-ui/src/components/projects/PortfolioTable.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/projects/ProjectCollection.js (renamed from opendc-web/opendc-web-ui/src/components/projects/ProjectCollection.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/projects/ProjectOverview.js (renamed from opendc-web/opendc-web-ui/src/components/projects/ProjectOverview.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/projects/TopologyTable.js (renamed from opendc-web/opendc-web-ui/src/components/projects/TopologyTable.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/RoomTable.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/RoomTable.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/TopologyMap.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/TopologyMap.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/TopologyOverview.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/TopologyOverview.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/map/GrayContainer.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/GrayContainer.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/map/MapConstants.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/MapConstants.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/map/MapStage.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/MapStage.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/map/MapStage.module.css (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/MapStage.module.css) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/map/RackContainer.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/RackContainer.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/map/RackEnergyFillContainer.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/RackEnergyFillContainer.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/map/RackSpaceFillContainer.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/RackSpaceFillContainer.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/map/RoomContainer.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/RoomContainer.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/map/TileContainer.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/TileContainer.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/map/TopologyContainer.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/TopologyContainer.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/map/WallContainer.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/WallContainer.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/map/controls/Collapse.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/controls/Collapse.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/map/controls/Collapse.module.css (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/controls/Collapse.module.css) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/map/controls/ScaleIndicator.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/controls/ScaleIndicator.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/map/controls/ScaleIndicator.module.css (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/controls/ScaleIndicator.module.css) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/map/controls/Toolbar.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/controls/Toolbar.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/map/controls/Toolbar.module.css (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/controls/Toolbar.module.css) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/map/elements/Backdrop.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/elements/Backdrop.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/map/elements/GrayLayer.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/elements/GrayLayer.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/map/elements/HoverTile.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/elements/HoverTile.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/map/elements/ImageComponent.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/elements/ImageComponent.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/map/elements/RackFillBar.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/elements/RackFillBar.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/map/elements/RoomTile.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/elements/RoomTile.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/map/elements/TileObject.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/elements/TileObject.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/map/elements/TilePlusIcon.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/elements/TilePlusIcon.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/map/elements/WallSegment.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/elements/WallSegment.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/map/groups/GridGroup.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/groups/GridGroup.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/map/groups/RackGroup.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/groups/RackGroup.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/map/groups/RoomGroup.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/groups/RoomGroup.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/map/groups/TileGroup.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/groups/TileGroup.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/map/groups/TopologyGroup.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/groups/TopologyGroup.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/map/groups/WallGroup.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/groups/WallGroup.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/map/layers/HoverLayerComponent.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/layers/HoverLayerComponent.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/map/layers/MapLayer.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/layers/MapLayer.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/map/layers/ObjectHoverLayer.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/layers/ObjectHoverLayer.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/map/layers/RoomHoverLayer.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/map/layers/RoomHoverLayer.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/NameComponent.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/sidebar/NameComponent.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/TopologySidebar.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/sidebar/TopologySidebar.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/TopologySidebar.module.css (renamed from opendc-web/opendc-web-ui/src/components/topologies/sidebar/TopologySidebar.module.css) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/building/BuildingSidebar.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/sidebar/building/BuildingSidebar.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/building/NewRoomConstructionComponent.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/sidebar/building/NewRoomConstructionComponent.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/building/NewRoomConstructionContainer.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/sidebar/building/NewRoomConstructionContainer.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/machine/DeleteMachine.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/sidebar/machine/DeleteMachine.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/machine/MachineSidebar.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/sidebar/machine/MachineSidebar.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/machine/UnitAddComponent.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/sidebar/machine/UnitAddComponent.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/machine/UnitAddContainer.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/sidebar/machine/UnitAddContainer.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/machine/UnitListComponent.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/sidebar/machine/UnitListComponent.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/machine/UnitListContainer.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/sidebar/machine/UnitListContainer.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/machine/UnitTabsComponent.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/sidebar/machine/UnitTabsComponent.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/machine/UnitType.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/sidebar/machine/UnitType.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/rack/AddPrefab.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/sidebar/rack/AddPrefab.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/rack/DeleteRackContainer.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/sidebar/rack/DeleteRackContainer.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/rack/MachineComponent.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/sidebar/rack/MachineComponent.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/rack/MachineListComponent.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/sidebar/rack/MachineListComponent.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/rack/MachineListContainer.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/sidebar/rack/MachineListContainer.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/rack/RackNameContainer.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/sidebar/rack/RackNameContainer.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/rack/RackSidebar.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/sidebar/rack/RackSidebar.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/rack/RackSidebar.module.css (renamed from opendc-web/opendc-web-ui/src/components/topologies/sidebar/rack/RackSidebar.module.css) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/room/DeleteRoomContainer.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/sidebar/room/DeleteRoomContainer.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/room/EditRoomContainer.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/sidebar/room/EditRoomContainer.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/room/RackConstructionComponent.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/sidebar/room/RackConstructionComponent.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/room/RackConstructionContainer.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/sidebar/room/RackConstructionContainer.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/room/RoomName.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/sidebar/room/RoomName.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/room/RoomSidebar.js (renamed from opendc-web/opendc-web-ui/src/components/topologies/sidebar/room/RoomSidebar.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/util/TableEmptyState.js (renamed from opendc-web/opendc-web-ui/src/components/util/TableEmptyState.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/util/modals/ConfirmationModal.js (renamed from opendc-web/opendc-web-ui/src/components/util/modals/ConfirmationModal.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/util/modals/Modal.js (renamed from opendc-web/opendc-web-ui/src/components/util/modals/Modal.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/components/util/modals/TextInputModal.js (renamed from opendc-web/opendc-web-ui/src/components/util/modals/TextInputModal.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/config.js (renamed from opendc-web/opendc-web-ui/src/config.js) | 12 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/data/experiments.js (renamed from opendc-web/opendc-web-ui/src/data/experiments.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/data/project.js (renamed from opendc-web/opendc-web-ui/src/data/project.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/data/query.js (renamed from opendc-web/opendc-web-ui/src/data/query.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/data/topology.js (renamed from opendc-web/opendc-web-ui/src/data/topology.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/data/user.js (renamed from opendc-web/opendc-web-ui/src/data/user.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/next.config.js (renamed from opendc-web/opendc-web-ui/next.config.js) | 7 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/package-lock.json (renamed from opendc-web/opendc-web-ui/package-lock.json) | 3495 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/package.json (renamed from opendc-web/opendc-web-ui/package.json) | 3 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/pages/404.js (renamed from opendc-web/opendc-web-ui/src/pages/404.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/pages/_app.js (renamed from opendc-web/opendc-web-ui/src/pages/_app.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/pages/_document.js (renamed from opendc-web/opendc-web-ui/src/pages/_document.js) | 2 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/pages/logout.js (renamed from opendc-web/opendc-web-ui/src/pages/logout.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/pages/projects/[project]/index.js (renamed from opendc-web/opendc-web-ui/src/pages/projects/[project]/index.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/pages/projects/[project]/portfolios/[portfolio].js (renamed from opendc-web/opendc-web-ui/src/pages/projects/[project]/portfolios/[portfolio].js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/pages/projects/[project]/topologies/[topology].js (renamed from opendc-web/opendc-web-ui/src/pages/projects/[project]/topologies/[topology].js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/pages/projects/index.js (renamed from opendc-web/opendc-web-ui/src/pages/projects/index.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/public/favicon.ico (renamed from opendc-web/opendc-web-ui/public/favicon.ico) | bin | 99678 -> 99678 bytes | |||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/public/humans.txt (renamed from opendc-web/opendc-web-ui/public/humans.txt) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/public/img/avatar.svg (renamed from opendc-web/opendc-web-ui/public/img/avatar.svg) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/public/img/datacenter-drawing.png (renamed from opendc-web/opendc-web-ui/public/img/datacenter-drawing.png) | bin | 207909 -> 207909 bytes | |||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/public/img/logo.png (renamed from opendc-web/opendc-web-ui/public/img/logo.png) | bin | 2825 -> 2825 bytes | |||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/public/img/logo.svg (renamed from opendc-web/opendc-web-ui/public/img/logo.svg) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/public/img/opendc-architecture.png (renamed from opendc-web/opendc-web-ui/public/img/opendc-architecture.png) | bin | 45056 -> 45056 bytes | |||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/public/img/opendc-timeline-v2.png (renamed from opendc-web/opendc-web-ui/public/img/opendc-timeline-v2.png) | bin | 33460 -> 33460 bytes | |||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/public/img/portraits/aiosup.png (renamed from opendc-web/opendc-web-ui/public/img/portraits/aiosup.png) | bin | 71879 -> 71879 bytes | |||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/public/img/portraits/evaneyk.png (renamed from opendc-web/opendc-web-ui/public/img/portraits/evaneyk.png) | bin | 89028 -> 89028 bytes | |||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/public/img/portraits/fmastenbroek.png (renamed from opendc-web/opendc-web-ui/public/img/portraits/fmastenbroek.png) | bin | 123006 -> 123006 bytes | |||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/public/img/portraits/gandreadis.png (renamed from opendc-web/opendc-web-ui/public/img/portraits/gandreadis.png) | bin | 76426 -> 76426 bytes | |||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/public/img/portraits/hhe.png (renamed from opendc-web/opendc-web-ui/public/img/portraits/hhe.png) | bin | 102718 -> 102718 bytes | |||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/public/img/portraits/jbosch.png (renamed from opendc-web/opendc-web-ui/public/img/portraits/jbosch.png) | bin | 101618 -> 101618 bytes | |||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/public/img/portraits/jburley.png (renamed from opendc-web/opendc-web-ui/public/img/portraits/jburley.png) | bin | 328112 -> 328112 bytes | |||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/public/img/portraits/lfdversluis.png (renamed from opendc-web/opendc-web-ui/public/img/portraits/lfdversluis.png) | bin | 67796 -> 67796 bytes | |||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/public/img/portraits/loverweel.png (renamed from opendc-web/opendc-web-ui/public/img/portraits/loverweel.png) | bin | 65866 -> 65866 bytes | |||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/public/img/portraits/sjounaid.png (renamed from opendc-web/opendc-web-ui/public/img/portraits/sjounaid.png) | bin | 94523 -> 94523 bytes | |||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/public/img/portraits/vvanbeek.png (renamed from opendc-web/opendc-web-ui/public/img/portraits/vvanbeek.png) | bin | 85159 -> 85159 bytes | |||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/public/img/portraits/wlai.png (renamed from opendc-web/opendc-web-ui/public/img/portraits/wlai.png) | bin | 72873 -> 72873 bytes | |||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/public/img/screenshot-construction.png (renamed from opendc-web/opendc-web-ui/public/img/screenshot-construction.png) | bin | 275103 -> 275103 bytes | |||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/public/img/screenshot-simulation.png (renamed from opendc-web/opendc-web-ui/public/img/screenshot-simulation.png) | bin | 291836 -> 291836 bytes | |||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/public/img/stakeholders/Developer.png (renamed from opendc-web/opendc-web-ui/public/img/stakeholders/Developer.png) | bin | 11411 -> 11411 bytes | |||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/public/img/stakeholders/Manager.png (renamed from opendc-web/opendc-web-ui/public/img/stakeholders/Manager.png) | bin | 9946 -> 9946 bytes | |||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/public/img/stakeholders/Researcher.png (renamed from opendc-web/opendc-web-ui/public/img/stakeholders/Researcher.png) | bin | 10984 -> 10984 bytes | |||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/public/img/stakeholders/Sales.png (renamed from opendc-web/opendc-web-ui/public/img/stakeholders/Sales.png) | bin | 10074 -> 10074 bytes | |||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/public/img/stakeholders/Student.png (renamed from opendc-web/opendc-web-ui/public/img/stakeholders/Student.png) | bin | 12960 -> 12960 bytes | |||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/public/img/topology/cpu-icon.png (renamed from opendc-web/opendc-web-ui/public/img/topology/cpu-icon.png) | bin | 4062 -> 4062 bytes | |||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/public/img/topology/gpu-icon.png (renamed from opendc-web/opendc-web-ui/public/img/topology/gpu-icon.png) | bin | 2227 -> 2227 bytes | |||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/public/img/topology/memory-icon.png (renamed from opendc-web/opendc-web-ui/public/img/topology/memory-icon.png) | bin | 1980 -> 1980 bytes | |||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/public/img/topology/rack-energy-icon.png (renamed from opendc-web/opendc-web-ui/public/img/topology/rack-energy-icon.png) | bin | 893 -> 893 bytes | |||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/public/img/topology/rack-space-icon.png (renamed from opendc-web/opendc-web-ui/public/img/topology/rack-space-icon.png) | bin | 957 -> 957 bytes | |||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/public/img/topology/storage-icon.png (renamed from opendc-web/opendc-web-ui/public/img/topology/storage-icon.png) | bin | 4038 -> 4038 bytes | |||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/public/img/tudelft-icon.png (renamed from opendc-web/opendc-web-ui/public/img/tudelft-icon.png) | bin | 4387 -> 4387 bytes | |||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/public/manifest.json (renamed from opendc-web/opendc-web-ui/public/manifest.json) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/public/robots.txt (renamed from opendc-web/opendc-web-ui/public/robots.txt) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/redux/actions/interaction-level.js (renamed from opendc-web/opendc-web-ui/src/redux/actions/interaction-level.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/redux/actions/topology/building.js (renamed from opendc-web/opendc-web-ui/src/redux/actions/topology/building.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/redux/actions/topology/index.js (renamed from opendc-web/opendc-web-ui/src/redux/actions/topology/index.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/redux/actions/topology/machine.js (renamed from opendc-web/opendc-web-ui/src/redux/actions/topology/machine.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/redux/actions/topology/rack.js (renamed from opendc-web/opendc-web-ui/src/redux/actions/topology/rack.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/redux/actions/topology/room.js (renamed from opendc-web/opendc-web-ui/src/redux/actions/topology/room.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/redux/index.js (renamed from opendc-web/opendc-web-ui/src/redux/index.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/redux/reducers/construction-mode.js (renamed from opendc-web/opendc-web-ui/src/redux/reducers/construction-mode.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/redux/reducers/index.js (renamed from opendc-web/opendc-web-ui/src/redux/reducers/index.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/redux/reducers/interaction-level.js (renamed from opendc-web/opendc-web-ui/src/redux/reducers/interaction-level.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/redux/reducers/topology/index.js (renamed from opendc-web/opendc-web-ui/src/redux/reducers/topology/index.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/redux/reducers/topology/machine.js (renamed from opendc-web/opendc-web-ui/src/redux/reducers/topology/machine.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/redux/reducers/topology/rack.js (renamed from opendc-web/opendc-web-ui/src/redux/reducers/topology/rack.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/redux/reducers/topology/room.js (renamed from opendc-web/opendc-web-ui/src/redux/reducers/topology/room.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/redux/reducers/topology/tile.js (renamed from opendc-web/opendc-web-ui/src/redux/reducers/topology/tile.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/redux/reducers/topology/topology.js (renamed from opendc-web/opendc-web-ui/src/redux/reducers/topology/topology.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/redux/sagas/index.js (renamed from opendc-web/opendc-web-ui/src/redux/sagas/index.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/redux/sagas/topology.js (renamed from opendc-web/opendc-web-ui/src/redux/sagas/topology.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/shapes.js (renamed from opendc-web/opendc-web-ui/src/shapes.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/style/index.css (renamed from opendc-web/opendc-web-ui/src/style/index.css) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/util/authorizations.js (renamed from opendc-web/opendc-web-ui/src/util/authorizations.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/util/available-metrics.js (renamed from opendc-web/opendc-web-ui/src/util/available-metrics.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/util/colors.js (renamed from opendc-web/opendc-web-ui/src/util/colors.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/util/date-time.js (renamed from opendc-web/opendc-web-ui/src/util/date-time.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/util/date-time.test.js (renamed from opendc-web/opendc-web-ui/src/util/date-time.test.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/util/effect-ref.js (renamed from opendc-web/opendc-web-ui/src/util/effect-ref.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/util/tile-calculations.js (renamed from opendc-web/opendc-web-ui/src/util/tile-calculations.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/util/topology-schema.js (renamed from opendc-web/opendc-web-ui/src/util/topology-schema.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/main/webui/util/unit-specifications.js (renamed from opendc-web/opendc-web-ui/src/util/unit-specifications.js) | 0 | ||||
| -rw-r--r-- | opendc-web/opendc-web-server/src/test/java/org/opendc/web/server/service/UserAccountingServiceTest.java | 10 | ||||
| -rw-r--r-- | opendc-web/opendc-web-ui-quarkus-deployment/src/main/java/org/opendc/web/ui/deployment/OpenDCUiProcessor.java | 301 | ||||
| -rw-r--r-- | opendc-web/opendc-web-ui-quarkus/src/main/java/org/opendc/web/ui/runtime/OpenDCUiRecorder.java | 98 | ||||
| -rw-r--r-- | opendc-web/opendc-web-ui-quarkus/src/main/java/org/opendc/web/ui/runtime/OpenDCUiRuntimeConfig.java | 39 | ||||
| -rw-r--r-- | opendc-web/opendc-web-ui/build.gradle.kts | 144 | ||||
| -rwxr-xr-x | opendc-web/opendc-web-ui/scripts/envsubst.sh | 14 | ||||
| -rw-r--r-- | settings.gradle.kts | 9 |
276 files changed, 4346 insertions, 1255 deletions
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2ad559ce..5baa64e9 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -78,11 +78,6 @@ jobs: steps: - name: Checkout repository uses: actions/checkout@v4 - - name: Build UI - uses: docker/build-push-action@v6 - with: - context: opendc-web/opendc-web-ui - file: opendc-web/opendc-web-ui/Dockerfile - name: Build Web Server uses: docker/build-push-action@v6 with: @@ -118,3 +118,10 @@ gradle-app.setting # Demo files demo/* + +.ai +.junie +AGENTS.md +target +.claude +CLAUDE.md diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index 7bd67f72..ce5f79c5 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -38,9 +38,6 @@ dependencies { implementation(libs.jmh.gradle) implementation(libs.dokka.gradle) - implementation(libs.jandex.gradle) implementation(libs.quarkus.gradle.application) implementation(libs.quarkus.gradle.extension) - - implementation(libs.gradle.node) } diff --git a/buildSrc/src/main/kotlin/quarkus-conventions.gradle.kts b/buildSrc/src/main/kotlin/quarkus-conventions.gradle.kts index 3bd3d85a..e811519e 100644 --- a/buildSrc/src/main/kotlin/quarkus-conventions.gradle.kts +++ b/buildSrc/src/main/kotlin/quarkus-conventions.gradle.kts @@ -23,10 +23,7 @@ import org.gradle.api.artifacts.type.ArtifactTypeDefinition import org.gradle.api.attributes.Category import org.gradle.api.attributes.VerificationType -import org.gradle.kotlin.dsl.dependencies import org.gradle.kotlin.dsl.get -import org.gradle.kotlin.dsl.kotlin -import org.gradle.kotlin.dsl.withType plugins { id("java-conventions") @@ -48,7 +45,6 @@ configurations.create("coverageDataElementsForQuarkus") { extendsFrom(configurations["implementation"], configurations["runtimeOnly"]) - @Suppress("UnstableApiUsage") attributes { attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category::class.java, Category.VERIFICATION)) attribute(VerificationType.VERIFICATION_TYPE_ATTRIBUTE, objects.named(VerificationType::class.java, VerificationType.JACOCO_RESULTS)) @@ -56,7 +52,6 @@ configurations.create("coverageDataElementsForQuarkus") { artifacts { add("coverageDataElementsForQuarkus", layout.buildDirectory.file("jacoco-quarkus.exec")) { - @Suppress("UnstableApiUsage") type = ArtifactTypeDefinition.BINARY_DATA_TYPE builtBy(tasks.test) } diff --git a/docker-compose.override.yml b/docker-compose.override.yml index 35a7feb8..d5428c4e 100644 --- a/docker-compose.override.yml +++ b/docker-compose.override.yml @@ -2,13 +2,6 @@ version: "3.8" # Docker Compose overrides for development environments services: - ui: - build: opendc-web/opendc-web-ui - ports: - - "8080:3000" - environment: - NEXT_PUBLIC_API_BASE_URL: http://localhost:8081 - server: build: context: . @@ -18,7 +11,7 @@ services: OPENDC_AUTH0_AUDIENCE: ${OPENDC_AUTH0_AUDIENCE:?No Auth0 audience specified} OPENDC_AUTH0_DOCS_CLIENT_ID: ${OPENDC_AUTH0_DOCS_CLIENT_ID} ports: - - "8081:8080" + - "8080:8080" environment: SENTRY_ENVIRONMENT: "development" diff --git a/docker-compose.yml b/docker-compose.yml index 65354e67..8b3c92a9 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,18 +1,5 @@ version: "3.8" services: - ui: - image: atlargeresearch/opendc-ui:v2.1 - restart: on-failure - networks: - - backend - depends_on: - - server - environment: - NEXT_PUBLIC_AUTH0_DOMAIN: ${OPENDC_AUTH0_DOMAIN} - NEXT_PUBLIC_AUTH0_CLIENT_ID: ${OPENDC_AUTH0_CLIENT_ID} - NEXT_PUBLIC_AUTH0_AUDIENCE: ${OPENDC_AUTH0_AUDIENCE} - NEXT_PUBLIC_SENTRY_DSN: ${OPENDC_UI_SENTRY_DSN-} - server: image: atlargeresearch/opendc:v2.1 restart: on-failure @@ -34,7 +21,7 @@ services: SENTRY_DSN: ${OPENDC_SERVER_SENTRY_DSN-} postgres: - image: postgres + image: postgres:17.9 restart: on-failure environment: POSTGRES_USER: ${OPENDC_DB_USERNAME} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 44cd4003..8c326883 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,31 +1,33 @@ [versions] calcite = "1.36.0" -clikt = "3.5.2" +clikt = "4.2.1" commons-math3 = "3.6.1" dokka = "1.9.10" -gradle-node = "3.5.1" hadoop = "3.3.6" hypersistence-utils = "3.7.3" jackson = "2.16.1" jandex-gradle = "1.1.0" java = "21" jline = "3.25.1" -jmh-gradle = "0.7.0" +jmh-gradle = "0.7.1" jakarta = "3.0.2" +jakarta-ws-rs = "3.1.0" junit-jupiter = "5.10.2" kotlin = "1.9.22" kotlin-logging = "3.0.5" kotlinx-coroutines = "1.8.0" log4j = "2.23.0" -microprofile-openapi = "3.1" +microprofile-rest-client = "3.0.1" +microprofile-openapi = "3.1.1" microprofile-config = "3.1" mockk = "1.13.9" node = "18.15.0" parquet = "1.13.1" progressbar = "0.10.0" quarkus = "3.8.0" +quarkus-quinoa = "2.3.4" sentry = "7.4.0" -slf4j = "2.0.7" +slf4j = "2.0.9" spotless = "6.25.0" [libraries] @@ -85,7 +87,9 @@ quarkus-hibernate-validator = { module = "io.quarkus:quarkus-hibernate-validator quarkus-jdbc-h2 = { module = "io.quarkus:quarkus-jdbc-h2" } quarkus-jdbc-postgresql = { module = "io.quarkus:quarkus-jdbc-postgresql" } quarkus-flyway = { module = "io.quarkus:quarkus-flyway" } -hypersistence-utils-hibernate = { module = "io.hypersistence:hypersistence-utils-hibernate-60", version.ref = "hypersistence-utils" } +hypersistence-utils-hibernate = { module = "io.hypersistence:hypersistence-utils-hibernate-63", version.ref = "hypersistence-utils" } +quarkus-quinoa-runtime = { module = "io.quarkiverse.quinoa:quarkus-quinoa", version.ref = "quarkus-quinoa" } +quarkus-quinoa-deployment = { module = "io.quarkiverse.quinoa:quarkus-quinoa-deployment", version.ref = "quarkus-quinoa" } # Quarkus (Testing) quarkus-junit5-core = { module = "io.quarkus:quarkus-junit5" } @@ -100,16 +104,15 @@ jline = { module = "org.jline:jline", version.ref = "jline" } # Other jakarta-validation = { module = "jakarta.validation:jakarta.validation-api", version.ref = "jakarta" } -jakarta-ws-rs = { module = "jakarta.ws.rs:jakarta.ws.rs-api", version.ref = "jakarta" } +jakarta-ws-rs-api = { module = "jakarta.ws.rs:jakarta.ws.rs-api", version.ref = "jakarta-ws-rs" } hadoop-common = { module = "org.apache.hadoop:hadoop-common", version.ref = "hadoop" } hadoop-mapreduce-client-core = { module = "org.apache.hadoop:hadoop-mapreduce-client-core", version.ref = "hadoop" } commons-math3 = { module = "org.apache.commons:commons-math3", version.ref = "commons-math3" } +microprofile-rest-client-api = { module = "org.eclipse.microprofile.rest.client:microprofile-rest-client-api", version.ref = "microprofile-rest-client" } microprofile-openapi-api = { module = "org.eclipse.microprofile.openapi:microprofile-openapi-api", version.ref = "microprofile-openapi" } microprofile-config = { module = "org.eclipse.microprofile.config:microprofile-config-api", version.ref = "microprofile-config" } # Other (Build) dokka-gradle = { module = "org.jetbrains.dokka:dokka-gradle-plugin", version.ref = "dokka" } -gradle-node = { module = "com.github.node-gradle:gradle-node-plugin", version.ref = "gradle-node" } -jandex-gradle = { module = "org.kordamp.gradle:jandex-gradle-plugin", version.ref = "jandex-gradle" } jmh-gradle = { module = "me.champeau.jmh:jmh-gradle-plugin", version.ref = "jmh-gradle" } spotless-gradle = { module = "com.diffplug.spotless:spotless-plugin-gradle", version.ref = "spotless" } diff --git a/opendc-web/opendc-web-proto/build.gradle.kts b/opendc-web/opendc-web-proto/build.gradle.kts index 9b307655..bbec8bd0 100644 --- a/opendc-web/opendc-web-proto/build.gradle.kts +++ b/opendc-web/opendc-web-proto/build.gradle.kts @@ -24,16 +24,13 @@ description = "Web communication protocol for OpenDC" // Build configuration plugins { - `kotlin-library-conventions` - id("org.kordamp.gradle.jandex") // Necessary for Quarkus to process annotations + `java-library-conventions` } dependencies { implementation(libs.jackson.annotations) implementation(libs.jakarta.validation) + implementation(libs.jakarta.ws.rs.api) + implementation(libs.microprofile.rest.client.api) implementation(libs.microprofile.openapi.api) } - -tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> { - kotlinOptions.javaParameters = true -} diff --git a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/JobState.kt b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/JobState.java index a8e67ec5..14a0faba 100644 --- a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/JobState.kt +++ b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/JobState.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 AtLarge Research + * Copyright (c) 2023 AtLarge Research * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -20,12 +20,12 @@ * SOFTWARE. */ -package org.opendc.web.proto +package org.opendc.web.proto; /** * State of a scenario for the simulator runner. */ -public enum class JobState { +public enum JobState { /** * The job is pending to be claimed by a runner. */ @@ -49,5 +49,5 @@ public enum class JobState { /** * The job has failed. */ - FAILED, + FAILED } diff --git a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/OperationalPhenomena.kt b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/OperationalPhenomena.java index 28006d27..cf492e38 100644 --- a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/OperationalPhenomena.kt +++ b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/OperationalPhenomena.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 AtLarge Research + * Copyright (c) 2023 AtLarge Research * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -20,12 +20,9 @@ * SOFTWARE. */ -package org.opendc.web.proto +package org.opendc.web.proto; /** * Object describing the enabled operational phenomena for a scenario. */ -public data class OperationalPhenomena( - val failures: Boolean, - val interference: Boolean, -) +public record OperationalPhenomena(boolean failures, boolean interference) {} diff --git a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/ProtocolError.kt b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/ProtocolError.java index e7fe2702..cb9324ea 100644 --- a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/ProtocolError.kt +++ b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/ProtocolError.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 AtLarge Research + * Copyright (c) 2023 AtLarge Research * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -20,9 +20,9 @@ * SOFTWARE. */ -package org.opendc.web.proto +package org.opendc.web.proto; /** * Container for reporting errors. */ -public data class ProtocolError(val code: Int, val message: String) +public record ProtocolError(int code, String message) {} diff --git a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/Targets.kt b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/Targets.java index 25516ff0..4823bb66 100644 --- a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/Targets.kt +++ b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/Targets.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 AtLarge Research + * Copyright (c) 2023 AtLarge Research * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -20,9 +20,10 @@ * SOFTWARE. */ -package org.opendc.web.proto +package org.opendc.web.proto; -import jakarta.validation.constraints.Min +import jakarta.validation.constraints.Min; +import java.util.Set; /** * The targets of a portfolio. @@ -30,8 +31,4 @@ import jakarta.validation.constraints.Min * @param metrics The selected metrics to track during simulation. * @param repeats The number of repetitions per scenario. */ -public data class Targets( - val metrics: Set<String>, - @field:Min(1) - val repeats: Int = 1, -) +public record Targets(Set<String> metrics, @Min(1) int repeats) {} diff --git a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/Trace.kt b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/Trace.java index 2952a273..adf916d3 100644 --- a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/Trace.kt +++ b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/Trace.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 AtLarge Research + * Copyright (c) 2023 AtLarge Research * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -20,7 +20,7 @@ * SOFTWARE. */ -package org.opendc.web.proto +package org.opendc.web.proto; /** * A workload trace available for simulation. @@ -29,8 +29,4 @@ package org.opendc.web.proto * @param name The name of the trace. * @param type The type of trace. */ -public data class Trace( - val id: String, - val name: String, - val type: String, -) +public record Trace(String id, String name, String type) {} diff --git a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/Workload.kt b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/Workload.java index 58daf817..e8f552d6 100644 --- a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/Workload.kt +++ b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/Workload.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 AtLarge Research + * Copyright (c) 2023 AtLarge Research * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -20,25 +20,24 @@ * SOFTWARE. */ -package org.opendc.web.proto +package org.opendc.web.proto; -import jakarta.validation.constraints.DecimalMax -import jakarta.validation.constraints.DecimalMin +import jakarta.validation.constraints.DecimalMax; +import jakarta.validation.constraints.DecimalMin; /** * The workload to simulate for a scenario. */ -public data class Workload(val trace: Trace, val samplingFraction: Double) { +public record Workload(Trace trace, double samplingFraction) { /** * Specification for a workload. * * @param trace The unique identifier of the trace. * @param samplingFraction The fraction of the workload to sample. */ - public data class Spec( - val trace: String, - @DecimalMin(value = "0.001", message = "Sampling fraction must be non-zero") - @DecimalMax(value = "1", message = "Sampling fraction cannot exceed one") - val samplingFraction: Double, - ) + public record Spec( + String trace, + @DecimalMin(value = "0.001", message = "Sampling fraction must be non-zero") + @DecimalMax(value = "1", message = "Sampling fraction cannot exceed one") + double samplingFraction) {} } diff --git a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/runner/Job.kt b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/runner/Job.java index 34642436..587fe451 100644 --- a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/runner/Job.kt +++ b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/runner/Job.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 AtLarge Research + * Copyright (c) 2023 AtLarge Research * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -20,32 +20,32 @@ * SOFTWARE. */ -package org.opendc.web.proto.runner +package org.opendc.web.proto.runner; -import org.eclipse.microprofile.openapi.annotations.media.Schema -import org.opendc.web.proto.JobState -import java.time.Instant +import java.time.Instant; +import java.util.Map; +import org.eclipse.microprofile.openapi.annotations.media.Schema; +import org.opendc.web.proto.JobState; /** * A simulation job to be simulated by a runner. */ @Schema(name = "Runner.Job") -public data class Job( - val id: Long, - val scenario: Scenario, - val state: JobState, - val createdAt: Instant, - val updatedAt: Instant, - val runtime: Int, - val results: Map<String, Any>? = null, -) { +public record Job( + long id, + Scenario scenario, + JobState state, + Instant createdAt, + Instant updatedAt, + int runtime, + Map<String, ?> results) { /** * A request to update the state of a job. * - * @property state The next state of the job. - * @property runtime The runtime of the job (in seconds). - * @property results The results of the job. + * @param state The next state of the job. + * @param runtime The runtime of the job (in seconds). + * @param results The results of the job. */ @Schema(name = "Runner.Job.Update") - public data class Update(val state: JobState, val runtime: Int, val results: Map<String, Any>? = null) + public record Update(JobState state, int runtime, Map<String, ?> results) {} } diff --git a/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/runner/JobService.java b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/runner/JobService.java new file mode 100644 index 00000000..33b520a0 --- /dev/null +++ b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/runner/JobService.java @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2023 AtLarge Research + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package org.opendc.web.proto.runner; + +import jakarta.validation.Valid; +import jakarta.ws.rs.Consumes; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.POST; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.PathParam; +import java.util.List; +import org.eclipse.microprofile.rest.client.inject.RegisterRestClient; + +/** + * Service for interacting with the OpenDC job server. + */ +@Path("/jobs") +@RegisterRestClient +public interface JobService { + /** + * Obtain all pending simulation jobs. + */ + @GET + List<Job> queryPending(); + + /** + * Get a job by identifier. + */ + @GET + @Path("{job}") + Job get(@PathParam("job") long id); + + /** + * Atomically update the state of a job. + */ + @POST + @Path("{job}") + @Consumes("application/json") + Job update(@PathParam("job") long id, @Valid Job.Update update); +} diff --git a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/runner/Portfolio.kt b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/runner/Portfolio.java index 916d8cf0..44f0b500 100644 --- a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/runner/Portfolio.kt +++ b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/runner/Portfolio.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 AtLarge Research + * Copyright (c) 2023 AtLarge Research * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -20,14 +20,13 @@ * SOFTWARE. */ -package org.opendc.web.proto.runner +package org.opendc.web.proto.runner; -import org.eclipse.microprofile.openapi.annotations.media.Schema -import org.opendc.web.proto.Targets -import org.opendc.web.proto.user.Portfolio +import org.eclipse.microprofile.openapi.annotations.media.Schema; +import org.opendc.web.proto.Targets; /** - * A [Portfolio] as seen from the runner's perspective. + * A {@link Portfolio} as seen from the runner's perspective. * * @param id The unique identifier of the portfolio. * @param number The number of the portfolio for the project. @@ -35,9 +34,4 @@ import org.opendc.web.proto.user.Portfolio * @param targets The targets of the portfolio. */ @Schema(name = "Runner.Portfolio") -public data class Portfolio( - val id: Long, - val number: Int, - val name: String, - val targets: Targets, -) +public record Portfolio(long id, int number, String name, Targets targets) {} diff --git a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/runner/Scenario.kt b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/runner/Scenario.java index ebc10bb0..8005ac3b 100644 --- a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/runner/Scenario.kt +++ b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/runner/Scenario.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 AtLarge Research + * Copyright (c) 2023 AtLarge Research * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -20,23 +20,22 @@ * SOFTWARE. */ -package org.opendc.web.proto.runner +package org.opendc.web.proto.runner; -import org.eclipse.microprofile.openapi.annotations.media.Schema -import org.opendc.web.proto.OperationalPhenomena -import org.opendc.web.proto.Workload +import org.eclipse.microprofile.openapi.annotations.media.Schema; +import org.opendc.web.proto.OperationalPhenomena; +import org.opendc.web.proto.Workload; /** - * A [Scenario] that is exposed to an OpenDC runner. + * A {@link Scenario} that is exposed to an OpenDC runner. */ @Schema(name = "Runner.Scenario") -public data class Scenario( - val id: Long, - val number: Int, - val portfolio: Portfolio, - val name: String, - val workload: Workload, - val topology: Topology, - val phenomena: OperationalPhenomena, - val schedulerName: String, -) +public record Scenario( + long id, + int number, + Portfolio portfolio, + String name, + Workload workload, + Topology topology, + OperationalPhenomena phenomena, + String schedulerName) {} diff --git a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/runner/Topology.kt b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/runner/Topology.java index 4bffdee9..fdabd12d 100644 --- a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/runner/Topology.kt +++ b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/runner/Topology.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 AtLarge Research + * Copyright (c) 2023 AtLarge Research * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -20,21 +20,15 @@ * SOFTWARE. */ -package org.opendc.web.proto.runner +package org.opendc.web.proto.runner; -import org.eclipse.microprofile.openapi.annotations.media.Schema -import org.opendc.web.proto.Room -import java.time.Instant +import java.time.Instant; +import java.util.List; +import org.eclipse.microprofile.openapi.annotations.media.Schema; +import org.opendc.web.proto.topology.Room; /** * A [Topology] that is exposed to an OpenDC runner. */ @Schema(name = "Runner.Topology") -public data class Topology( - val id: Long, - val number: Int, - val name: String, - val rooms: List<Room>, - val createdAt: Instant, - val updatedAt: Instant, -) +public record Topology(long id, int number, String name, List<Room> rooms, Instant createdAt, Instant updatedAt) {} diff --git a/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/topology/Machine.java b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/topology/Machine.java new file mode 100644 index 00000000..ec78f249 --- /dev/null +++ b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/topology/Machine.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2023 AtLarge Research + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package org.opendc.web.proto.topology; + +import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.List; + +/** + * A machine in a rack. + */ +public record Machine( + String id, + int position, + List<ProcessingUnit> cpus, + List<ProcessingUnit> gpus, + @JsonProperty("memories") List<MemoryUnit> memory, + @JsonProperty("storages") List<MemoryUnit> storage, + String rackId) {} diff --git a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/MemoryUnit.kt b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/topology/MemoryUnit.java index 00560ad6..a53b584a 100644 --- a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/MemoryUnit.kt +++ b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/topology/MemoryUnit.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 AtLarge Research + * Copyright (c) 2023 AtLarge Research * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -20,15 +20,9 @@ * SOFTWARE. */ -package org.opendc.web.proto +package org.opendc.web.proto.topology; /** * A memory unit in a system. */ -public data class MemoryUnit( - val id: String, - val name: String, - val speedMbPerS: Double, - val sizeMb: Double, - val energyConsumptionW: Double, -) +public record MemoryUnit(String id, String name, double speedMbPerS, double sizeMb, double energyConsumptionW) {} diff --git a/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/topology/ProcessingUnit.java b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/topology/ProcessingUnit.java new file mode 100644 index 00000000..baa61aac --- /dev/null +++ b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/topology/ProcessingUnit.java @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2023 AtLarge Research + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package org.opendc.web.proto.topology; + +/** + * A CPU model. + */ +public record ProcessingUnit( + String id, String name, double clockRateMhz, int numberOfCores, double energyConsumptionW) {} diff --git a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/Rack.kt b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/topology/Rack.java index c997e814..b68fddd3 100644 --- a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/Rack.kt +++ b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/topology/Rack.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 AtLarge Research + * Copyright (c) 2023 AtLarge Research * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -20,15 +20,11 @@ * SOFTWARE. */ -package org.opendc.web.proto +package org.opendc.web.proto.topology; + +import java.util.List; /** * A rack in a datacenter. */ -public data class Rack( - val id: String, - val name: String, - val capacity: Int, - val powerCapacityW: Double, - val machines: List<Machine>, -) +public record Rack(String id, String name, int capacity, double powerCapacityW, List<Machine> machines) {} diff --git a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/Room.kt b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/topology/Room.java index 5b305168..530d21f5 100644 --- a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/Room.kt +++ b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/topology/Room.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 AtLarge Research + * Copyright (c) 2023 AtLarge Research * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -20,14 +20,11 @@ * SOFTWARE. */ -package org.opendc.web.proto +package org.opendc.web.proto.topology; + +import java.util.Set; /** * A room in a datacenter. */ -public data class Room( - val id: String, - val name: String, - val tiles: Set<RoomTile>, - val topologyId: String? = null, -) +public record Room(String id, String name, Set<RoomTile> tiles, String topologyId) {} diff --git a/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/topology/RoomTile.java b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/topology/RoomTile.java new file mode 100644 index 00000000..a7240541 --- /dev/null +++ b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/topology/RoomTile.java @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2023 AtLarge Research + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package org.opendc.web.proto.topology; + +/** + * A location in a room. + */ +public record RoomTile(String id, double positionX, double positionY, Rack rack, String roomId) {} diff --git a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/ProcessingUnit.kt b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/user/Job.java index 86f40516..480efdad 100644 --- a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/ProcessingUnit.kt +++ b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/user/Job.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 AtLarge Research + * Copyright (c) 2023 AtLarge Research * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -20,15 +20,15 @@ * SOFTWARE. */ -package org.opendc.web.proto +package org.opendc.web.proto.user; + +import java.time.Instant; +import java.util.Map; +import org.opendc.web.proto.JobState; /** - * A CPU model. + * A simulation job that is associated with a {@link Scenario}. + * <p> + * This entity is exposed in the runner-facing API via {@link Job}. */ -public data class ProcessingUnit( - val id: String, - val name: String, - val clockRateMhz: Double, - val numberOfCores: Int, - val energyConsumptionW: Double, -) +public record Job(long id, JobState state, Instant createdAt, Instant updatedAt, Map<String, ?> results) {} diff --git a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/user/Portfolio.kt b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/user/Portfolio.java index 6f433a04..ff8d9e82 100644 --- a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/user/Portfolio.kt +++ b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/user/Portfolio.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 AtLarge Research + * Copyright (c) 2023 AtLarge Research * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -20,11 +20,12 @@ * SOFTWARE. */ -package org.opendc.web.proto.user +package org.opendc.web.proto.user; -import jakarta.validation.constraints.NotBlank -import org.eclipse.microprofile.openapi.annotations.media.Schema -import org.opendc.web.proto.Targets +import jakarta.validation.constraints.NotBlank; +import java.util.List; +import org.eclipse.microprofile.openapi.annotations.media.Schema; +import org.opendc.web.proto.Targets; /** * A portfolio is the composition of multiple scenarios. @@ -36,23 +37,13 @@ import org.opendc.web.proto.Targets * @param targets The targets of the portfolio. * @param scenarios The scenarios in the portfolio. */ -public data class Portfolio( - val id: Long, - val number: Int, - val project: Project, - val name: String, - val targets: Targets, - val scenarios: List<Scenario.Summary>, -) { +public record Portfolio( + long id, int number, Project project, String name, Targets targets, List<Scenario.Summary> scenarios) { /** * A request to create a new portfolio. */ @Schema(name = "Portfolio.Update") - public data class Create( - @field:NotBlank(message = "Name must not be empty") - val name: String, - val targets: Targets, - ) + public record Create(@NotBlank(message = "Name must not be empty") String name, Targets targets) {} /** * A summary view of a [Portfolio] provided for nested relations. @@ -63,10 +54,5 @@ public data class Portfolio( * @param targets The targets of the portfolio. */ @Schema(name = "Portfolio.Summary") - public data class Summary( - val id: Long, - val number: Int, - val name: String, - val targets: Targets, - ) + public record Summary(long id, int number, String name, Targets targets) {} } diff --git a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/user/Project.kt b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/user/Project.java index 635552a9..534fdb26 100644 --- a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/user/Project.kt +++ b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/user/Project.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 AtLarge Research + * Copyright (c) 2023 AtLarge Research * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -20,27 +20,19 @@ * SOFTWARE. */ -package org.opendc.web.proto.user +package org.opendc.web.proto.user; -import jakarta.validation.constraints.NotBlank -import org.eclipse.microprofile.openapi.annotations.media.Schema -import java.time.Instant +import jakarta.validation.constraints.NotBlank; +import java.time.Instant; +import org.eclipse.microprofile.openapi.annotations.media.Schema; /** * A project in OpenDC encapsulates all the datacenter designs and simulation runs for a set of users. */ -public data class Project( - val id: Long, - val name: String, - val createdAt: Instant, - val updatedAt: Instant, - val role: ProjectRole, -) { +public record Project(long id, String name, Instant createdAt, Instant updatedAt, ProjectRole role) { /** * A request to create a new project. */ @Schema(name = "Project.Create") - public data class Create( - @field:NotBlank(message = "Name must not be empty") val name: String, - ) + public record Create(@NotBlank(message = "Name must not be empty") String name) {} } diff --git a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/user/ProjectRole.kt b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/user/ProjectRole.java index 0f6de1fc..434ab472 100644 --- a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/user/ProjectRole.kt +++ b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/user/ProjectRole.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 AtLarge Research + * Copyright (c) 2023 AtLarge Research * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -20,12 +20,12 @@ * SOFTWARE. */ -package org.opendc.web.proto.user +package org.opendc.web.proto.user; /** * The role of a user in a project. */ -public enum class ProjectRole { +public enum ProjectRole { /** * The user is allowed to view the project. */ diff --git a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/user/Scenario.kt b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/user/Scenario.java index e0c790f5..7add5656 100644 --- a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/user/Scenario.kt +++ b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/user/Scenario.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 AtLarge Research + * Copyright (c) 2023 AtLarge Research * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -20,28 +20,28 @@ * SOFTWARE. */ -package org.opendc.web.proto.user +package org.opendc.web.proto.user; -import jakarta.validation.constraints.NotBlank -import org.eclipse.microprofile.openapi.annotations.media.Schema -import org.opendc.web.proto.OperationalPhenomena -import org.opendc.web.proto.Workload +import jakarta.validation.constraints.NotBlank; +import java.util.List; +import org.eclipse.microprofile.openapi.annotations.media.Schema; +import org.opendc.web.proto.OperationalPhenomena; +import org.opendc.web.proto.Workload; /** * A single scenario to be explored by the simulator. */ -public data class Scenario( - val id: Long, - val number: Int, - val project: Project, - val portfolio: Portfolio.Summary, - val name: String, - val workload: Workload, - val topology: Topology.Summary, - val phenomena: OperationalPhenomena, - val schedulerName: String, - val jobs: List<Job>, -) { +public record Scenario( + long id, + int number, + Project project, + Portfolio.Summary portfolio, + String name, + Workload workload, + Topology.Summary topology, + OperationalPhenomena phenomena, + String schedulerName, + List<Job> jobs) { /** * Create a new scenario. * @@ -52,14 +52,12 @@ public data class Scenario( * @param schedulerName The name of the scheduler. */ @Schema(name = "Scenario.Create") - public data class Create( - @field:NotBlank(message = "Name must not be empty") - val name: String, - val workload: Workload.Spec, - val topology: Long, - val phenomena: OperationalPhenomena, - val schedulerName: String, - ) + public record Create( + @NotBlank(message = "Name must not be empty") String name, + Workload.Spec workload, + long topology, + OperationalPhenomena phenomena, + String schedulerName) {} /** * A summary view of a [Scenario] provided for nested relations. @@ -70,17 +68,16 @@ public data class Scenario( * @param workload The workload to be modeled by the scenario. * @param phenomena The phenomena simulated for this scenario. * @param schedulerName The scheduler name to use for the experiment. - * @param job The simulation job associated with the scenario. + * @param jobs The simulation jobs associated with the scenario. */ @Schema(name = "Scenario.Summary") - public data class Summary( - val id: Long, - val number: Int, - val name: String, - val workload: Workload, - val topology: Topology.Summary, - val phenomena: OperationalPhenomena, - val schedulerName: String, - val jobs: List<Job>, - ) + public record Summary( + long id, + int number, + String name, + Workload workload, + Topology.Summary topology, + OperationalPhenomena phenomena, + String schedulerName, + List<Job> jobs) {} } diff --git a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/user/Topology.kt b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/user/Topology.java index 0943eaf8..7291c77b 100644 --- a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/user/Topology.kt +++ b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/user/Topology.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 AtLarge Research + * Copyright (c) 2023 AtLarge Research * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -20,40 +20,30 @@ * SOFTWARE. */ -package org.opendc.web.proto.user +package org.opendc.web.proto.user; -import jakarta.validation.constraints.NotBlank -import org.eclipse.microprofile.openapi.annotations.media.Schema -import org.opendc.web.proto.Room -import java.time.Instant +import jakarta.validation.constraints.NotBlank; +import java.time.Instant; +import java.util.List; +import org.eclipse.microprofile.openapi.annotations.media.Schema; +import org.opendc.web.proto.topology.Room; /** * Model for an OpenDC topology. */ -public data class Topology( - val id: Long, - val number: Int, - val project: Project, - val name: String, - val rooms: List<Room>, - val createdAt: Instant, - val updatedAt: Instant, -) { +public record Topology( + long id, int number, Project project, String name, List<Room> rooms, Instant createdAt, Instant updatedAt) { /** * Create a new topology for a project. */ @Schema(name = "Topology.Create") - public data class Create( - @field:NotBlank(message = "Name must not be empty") - val name: String, - val rooms: List<Room>, - ) + public record Create(@NotBlank(message = "Name must not be empty") String name, List<Room> rooms) {} /** * Update an existing topology. */ @Schema(name = "Topology.Update") - public data class Update(val rooms: List<Room>) + public record Update(List<Room> rooms) {} /** * A summary view of a [Topology] provided for nested relations. @@ -65,11 +55,5 @@ public data class Topology( * @param updatedAt The instant at which the topology was updated. */ @Schema(name = "Topology.Summary") - public data class Summary( - val id: Long, - val number: Int, - val name: String, - val createdAt: Instant, - val updatedAt: Instant, - ) + public record Summary(long id, int number, String name, Instant createdAt, Instant updatedAt) {} } diff --git a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/user/User.kt b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/user/User.java index 33dad4ff..030d9207 100644 --- a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/user/User.kt +++ b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/user/User.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 AtLarge Research + * Copyright (c) 2023 AtLarge Research * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -20,12 +20,9 @@ * SOFTWARE. */ -package org.opendc.web.proto.user +package org.opendc.web.proto.user; /** * A user of OpenDC. */ -public data class User( - val userId: String, - val accounting: UserAccounting, -) +public record User(String userId, UserAccounting accounting) {} diff --git a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/user/UserAccounting.kt b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/user/UserAccounting.java index 970721eb..3831381f 100644 --- a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/user/UserAccounting.kt +++ b/opendc-web/opendc-web-proto/src/main/java/org/opendc/web/proto/user/UserAccounting.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 AtLarge Research + * Copyright (c) 2023 AtLarge Research * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -20,15 +20,11 @@ * SOFTWARE. */ -package org.opendc.web.proto.user +package org.opendc.web.proto.user; -import java.time.LocalDate +import java.time.LocalDate; /** * Accounting data for a user. */ -public data class UserAccounting( - val periodEnd: LocalDate, - val simulationTime: Int, - val simulationTimeBudget: Int, -) +public record UserAccounting(LocalDate periodEnd, int simulationTime, int simulationTimeBudget) {} diff --git a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/RoomTile.kt b/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/RoomTile.kt deleted file mode 100644 index 666d66ee..00000000 --- a/opendc-web/opendc-web-proto/src/main/kotlin/org/opendc/web/proto/RoomTile.kt +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (c) 2022 AtLarge Research - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package org.opendc.web.proto - -/** - * A room tile. - */ -public data class RoomTile( - val id: String, - val positionX: Double, - val positionY: Double, - val rack: Rack? = null, - val roomId: String? = null, -) diff --git a/opendc-web/opendc-web-proto/src/main/resources/META-INF/beans.xml b/opendc-web/opendc-web-proto/src/main/resources/META-INF/beans.xml new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/opendc-web/opendc-web-proto/src/main/resources/META-INF/beans.xml diff --git a/opendc-web/opendc-web-ui-quarkus-deployment/build.gradle.kts b/opendc-web/opendc-web-quarkus-deployment/build.gradle.kts index 6be49e22..5dfdb65b 100644 --- a/opendc-web/opendc-web-ui-quarkus-deployment/build.gradle.kts +++ b/opendc-web/opendc-web-quarkus-deployment/build.gradle.kts @@ -30,10 +30,11 @@ plugins { dependencies { implementation(platform(libs.quarkus.bom)) - implementation(projects.opendcWeb.opendcWebUi) - implementation(projects.opendcWeb.opendcWebUiQuarkus) + implementation(projects.opendcWeb.opendcWebQuarkus) + implementation(projects.opendcTrace.opendcTraceApi) implementation(libs.quarkus.core.deployment) implementation(libs.quarkus.vertx.http.deployment) implementation(libs.quarkus.arc.deployment) + implementation(libs.quarkus.quinoa.deployment) } diff --git a/opendc-web/opendc-web-runner-quarkus-deployment/src/main/java/org/opendc/web/runner/deployment/OpenDCRunnerBuildItem.java b/opendc-web/opendc-web-quarkus-deployment/src/main/java/org/opendc/web/quarkus/deployment/runner/OpenDCRunnerBuildItem.java index 3be15ee3..544365c8 100644 --- a/opendc-web/opendc-web-runner-quarkus-deployment/src/main/java/org/opendc/web/runner/deployment/OpenDCRunnerBuildItem.java +++ b/opendc-web/opendc-web-quarkus-deployment/src/main/java/org/opendc/web/quarkus/deployment/runner/OpenDCRunnerBuildItem.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 AtLarge Research + * Copyright (c) 2023 AtLarge Research * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -20,7 +20,7 @@ * SOFTWARE. */ -package org.opendc.web.runner.deployment; +package org.opendc.web.quarkus.deployment.runner; import io.quarkus.builder.item.SimpleBuildItem; import io.quarkus.runtime.RuntimeValue; diff --git a/opendc-web/opendc-web-runner-quarkus-deployment/src/main/java/org/opendc/web/runner/deployment/OpenDCRunnerConfig.java b/opendc-web/opendc-web-quarkus-deployment/src/main/java/org/opendc/web/quarkus/deployment/runner/OpenDCRunnerConfig.java index ccbc5e19..1bc201b2 100644 --- a/opendc-web/opendc-web-runner-quarkus-deployment/src/main/java/org/opendc/web/runner/deployment/OpenDCRunnerConfig.java +++ b/opendc-web/opendc-web-quarkus-deployment/src/main/java/org/opendc/web/quarkus/deployment/runner/OpenDCRunnerConfig.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 AtLarge Research + * Copyright (c) 2023 AtLarge Research * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -20,7 +20,7 @@ * SOFTWARE. */ -package org.opendc.web.runner.deployment; +package org.opendc.web.quarkus.deployment.runner; import io.quarkus.runtime.annotations.ConfigItem; import io.quarkus.runtime.annotations.ConfigRoot; diff --git a/opendc-web/opendc-web-runner-quarkus-deployment/src/main/java/org/opendc/web/runner/deployment/OpenDCRunnerProcessor.java b/opendc-web/opendc-web-quarkus-deployment/src/main/java/org/opendc/web/quarkus/deployment/runner/OpenDCRunnerProcessor.java index 85a973e7..a796c01d 100644 --- a/opendc-web/opendc-web-runner-quarkus-deployment/src/main/java/org/opendc/web/runner/deployment/OpenDCRunnerProcessor.java +++ b/opendc-web/opendc-web-quarkus-deployment/src/main/java/org/opendc/web/quarkus/deployment/runner/OpenDCRunnerProcessor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 AtLarge Research + * Copyright (c) 2023 AtLarge Research * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -20,7 +20,7 @@ * SOFTWARE. */ -package org.opendc.web.runner.deployment; +package org.opendc.web.quarkus.deployment.runner; import static io.quarkus.deployment.annotations.ExecutionTime.RUNTIME_INIT; @@ -36,10 +36,10 @@ import java.io.IOException; import java.util.Set; import java.util.function.BooleanSupplier; import org.opendc.trace.spi.TraceFormat; +import org.opendc.web.quarkus.runtime.runner.OpenDCRunnerRecorder; +import org.opendc.web.quarkus.runtime.runner.OpenDCRunnerRuntimeConfig; import org.opendc.web.runner.JobManager; import org.opendc.web.runner.OpenDCRunner; -import org.opendc.web.runner.runtime.OpenDCRunnerRecorder; -import org.opendc.web.runner.runtime.OpenDCRunnerRuntimeConfig; /** * Build processor for the OpenDC web runner Quarkus extension. diff --git a/opendc-web/opendc-web-ui-quarkus-deployment/src/main/java/org/opendc/web/ui/deployment/OpenDCUiRoutingBuildItem.java b/opendc-web/opendc-web-quarkus-deployment/src/main/java/org/opendc/web/quarkus/deployment/ui/NextRouteManifestBuildItem.java index 6cf44893..4640b04b 100644 --- a/opendc-web/opendc-web-ui-quarkus-deployment/src/main/java/org/opendc/web/ui/deployment/OpenDCUiRoutingBuildItem.java +++ b/opendc-web/opendc-web-quarkus-deployment/src/main/java/org/opendc/web/quarkus/deployment/ui/NextRouteManifestBuildItem.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 AtLarge Research + * Copyright (c) 2023 AtLarge Research * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -20,28 +20,28 @@ * SOFTWARE. */ -package org.opendc.web.ui.deployment; +package org.opendc.web.quarkus.deployment.ui; import io.quarkus.builder.item.SimpleBuildItem; import java.util.List; /** - * Build item containing the routes for the OpenDC web UI. + * Build item containing the route manifest of the Next.js application. */ -public final class OpenDCUiRoutingBuildItem extends SimpleBuildItem { +public final class NextRouteManifestBuildItem extends SimpleBuildItem { private final boolean custom404; private final List<Page> pages; private final List<Redirect> redirects; /** - * Construct a {@link OpenDCUiRoutingBuildItem} instance. + * Construct a {@link NextRouteManifestBuildItem} object. * * @param routes The routes defined by Next.js. * @param redirects The redirects that have been defined by Next.js. * @param custom404 A flag to indicate that custom 404 pages are enabled. */ - public OpenDCUiRoutingBuildItem(List<Page> routes, List<Redirect> redirects, boolean custom404) { + public NextRouteManifestBuildItem(List<Page> routes, List<Redirect> redirects, boolean custom404) { this.custom404 = custom404; this.pages = routes; this.redirects = redirects; @@ -61,58 +61,18 @@ public final class OpenDCUiRoutingBuildItem extends SimpleBuildItem { /** * A redirect defined by the Next.js routes manifest. + * + * @param path The path that should result in a redirect. + * @param destination The destination of the redirect. + * @param statusCode The status code of the redirect. */ - public static final class Redirect { - - private final String path; - private final String destination; - private final int statusCode; - - /** - * Construct a {@link Redirect} route. - * - * @param path The path that should result in a redirect. - * @param destination The destination of the redirect. - * @param statusCode The status code of the redirect. - */ - public Redirect(String path, String destination, int statusCode) { - this.statusCode = statusCode; - this.path = path; - this.destination = destination; - } - - public String getPath() { - return path; - } - - public String getDestination() { - return destination; - } - - public int getStatusCode() { - return statusCode; - } - } + public record Redirect(String path, String destination, int statusCode) {} /** * A page defined by the Next.js routes manifest. + * + * @param path The path that to the page. + * @param name The name of the page. */ - public static final class Page { - - private final String path; - private final String name; - - public Page(String path, String page) { - this.path = path; - this.name = page; - } - - public String getPath() { - return path; - } - - public String getName() { - return name; - } - } + public record Page(String path, String name) {} } diff --git a/opendc-web/opendc-web-quarkus-deployment/src/main/java/org/opendc/web/quarkus/deployment/ui/OpenDCUiProcessor.java b/opendc-web/opendc-web-quarkus-deployment/src/main/java/org/opendc/web/quarkus/deployment/ui/OpenDCUiProcessor.java new file mode 100644 index 00000000..8b2c0244 --- /dev/null +++ b/opendc-web/opendc-web-quarkus-deployment/src/main/java/org/opendc/web/quarkus/deployment/ui/OpenDCUiProcessor.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2023 AtLarge Research + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package org.opendc.web.quarkus.deployment.ui; + +import io.quarkus.deployment.annotations.BuildProducer; +import io.quarkus.deployment.annotations.BuildStep; +import io.quarkus.deployment.annotations.ExecutionTime; +import io.quarkus.deployment.annotations.Record; +import io.quarkus.vertx.http.deployment.HttpRootPathBuildItem; +import io.quarkus.vertx.http.deployment.RouteBuildItem; +import org.opendc.web.quarkus.runtime.ui.OpenDCUiConfig; +import org.opendc.web.quarkus.runtime.ui.OpenDCUiRecorder; + +/** + * Quarkus build processor for the OpenDC web UI. + */ +public class OpenDCUiProcessor { + /** + * Register a route handler for serving the config of the OpenDC web UI. + */ + @BuildStep + @Record(ExecutionTime.RUNTIME_INIT) + public RouteBuildItem registerConfigHandler( + OpenDCUiRecorder openDCUiRecorder, + BuildProducer<RouteBuildItem> routes, + HttpRootPathBuildItem httpRootPathBuildItem, + OpenDCUiConfig openDCUiConfig) { + + String basePath = httpRootPathBuildItem.getRootPath(); + + return httpRootPathBuildItem + .routeBuilder() + .route(basePath + "/__ENV.js") + .handler(openDCUiRecorder.configHandler(openDCUiConfig)) + .build(); + } +} diff --git a/opendc-web/opendc-web-quarkus-deployment/src/main/java/org/opendc/web/quarkus/deployment/ui/QuinoaNextRoutingProcessor.java b/opendc-web/opendc-web-quarkus-deployment/src/main/java/org/opendc/web/quarkus/deployment/ui/QuinoaNextRoutingProcessor.java new file mode 100644 index 00000000..ddaa8809 --- /dev/null +++ b/opendc-web/opendc-web-quarkus-deployment/src/main/java/org/opendc/web/quarkus/deployment/ui/QuinoaNextRoutingProcessor.java @@ -0,0 +1,154 @@ +/* + * Copyright (c) 2023 AtLarge Research + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package org.opendc.web.quarkus.deployment.ui; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import io.quarkiverse.quinoa.deployment.items.BuiltResourcesBuildItem; +import io.quarkiverse.quinoa.deployment.items.ConfiguredQuinoaBuildItem; +import io.quarkiverse.quinoa.deployment.items.TargetDirBuildItem; +import io.quarkus.deployment.IsNormal; +import io.quarkus.deployment.annotations.BuildProducer; +import io.quarkus.deployment.annotations.BuildStep; +import io.quarkus.deployment.annotations.ExecutionTime; +import io.quarkus.deployment.annotations.Record; +import io.quarkus.vertx.http.deployment.HttpRootPathBuildItem; +import io.quarkus.vertx.http.deployment.RouteBuildItem; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.regex.Pattern; +import org.opendc.web.quarkus.runtime.ui.QuinoaNextRoutingRecorder; + +/** + * Quarkus build processor for enabling dynamic routes and redirects in Quinoa for Next.js applications. + */ +public class QuinoaNextRoutingProcessor { + private static final Pattern PATH_PARAM_PATTERN = Pattern.compile("\\[(\\w+)]"); + private final ObjectMapper objectMapper = new ObjectMapper(); + + /** + * Build the dynamic routes of the application based on the route manifest generated by Next.js. + * + * @param configuredQuinoa Quinoa configuration pointing to the UI directory. + * @param targetDirBuildItem Dependency on the build directory to ensure the Next.js is built before this build step + * is run. + * @return Routing manifest generated by the Next.js application. + */ + @BuildStep + public NextRouteManifestBuildItem buildRoutes( + ConfiguredQuinoaBuildItem configuredQuinoa, TargetDirBuildItem targetDirBuildItem) throws IOException { + if (configuredQuinoa == null) { + return null; + } + + Path routeManifestPath = configuredQuinoa.uiDir().resolve(".next/routes-manifest.json"); + if (Files.notExists(routeManifestPath)) { + throw new FileNotFoundException("Cannot find " + routeManifestPath + " for creating route map"); + } + + JsonNode routeManifest = objectMapper.readTree(routeManifestPath.toFile()); + + var pages = new ArrayList<NextRouteManifestBuildItem.Page>(); + for (Iterator<JsonNode> it = routeManifest.get("staticRoutes").elements(); it.hasNext(); ) { + JsonNode route = it.next(); + + String page = route.get("page").asText(); + + // Static routes do not have any path parameters + pages.add(new NextRouteManifestBuildItem.Page(page, page)); + } + + for (Iterator<JsonNode> it = routeManifest.get("dynamicRoutes").elements(); it.hasNext(); ) { + JsonNode route = it.next(); + + String page = route.get("page").asText(); + String path = PATH_PARAM_PATTERN.matcher(page).replaceAll(r -> ":" + r.group(1)); + + pages.add(new NextRouteManifestBuildItem.Page(path, page)); + } + + var redirects = new ArrayList<NextRouteManifestBuildItem.Redirect>(); + for (Iterator<JsonNode> it = routeManifest.get("redirects").elements(); it.hasNext(); ) { + JsonNode redirect = it.next(); + if (redirect.has("internal")) { + continue; + } + + int statusCode = redirect.get("statusCode").asInt(); + String path = redirect.get("source").asText(); + String destination = redirect.get("destination").asText(); + + if (path.isEmpty()) { + path = "/"; + } + + redirects.add(new NextRouteManifestBuildItem.Redirect(path, destination, statusCode)); + } + + var custom404 = routeManifest.get("pages404").asBoolean(); + return new NextRouteManifestBuildItem(pages, redirects, custom404); + } + + /** + * Register the dynamic routes and redirects of the Next.js application. + */ + @Record(ExecutionTime.RUNTIME_INIT) + @BuildStep(onlyIf = IsNormal.class) + public void registerNextRoutes( + QuinoaNextRoutingRecorder recorder, + BuildProducer<RouteBuildItem> routes, + HttpRootPathBuildItem httpRootPathBuildItem, + BuiltResourcesBuildItem uiResources, + NextRouteManifestBuildItem routeManifestBuildItem) { + + if (uiResources.getNames().isEmpty()) { + return; + } + + String basePath = httpRootPathBuildItem.getRootPath(); + + /* Construct redirects */ + for (var redirect : routeManifestBuildItem.getRedirects()) { + String destination = basePath.equals("/") ? redirect.destination() : basePath + redirect.destination(); + + routes.produce(httpRootPathBuildItem + .routeBuilder() + .route(basePath + redirect.path()) + .handler(recorder.redirectHandler(destination, redirect.statusCode())) + .build()); + } + + /* Construct dynamic routes */ + for (var page : routeManifestBuildItem.getPages()) { + routes.produce(httpRootPathBuildItem + .routeBuilder() + .route(basePath + page.path()) + .handler(recorder.pageHandler(basePath, page.name())) + .build()); + } + } +} diff --git a/opendc-web/opendc-web-ui-quarkus/build.gradle.kts b/opendc-web/opendc-web-quarkus/build.gradle.kts index 3f8887f6..a48c2eb3 100644 --- a/opendc-web/opendc-web-ui-quarkus/build.gradle.kts +++ b/opendc-web/opendc-web-quarkus/build.gradle.kts @@ -28,15 +28,15 @@ plugins { } quarkusExtension { - deploymentModule.set("opendc-web-ui-quarkus-deployment") + deploymentModule.set("opendc-web-quarkus-deployment") } dependencies { implementation(platform(libs.quarkus.bom)) + api(projects.opendcWeb.opendcWebRunner) + implementation(libs.quarkus.core.runtime) implementation(libs.quarkus.vertx.http.runtime) implementation(libs.quarkus.arc.runtime) } - -evaluationDependsOn(projects.opendcWeb.opendcWebUiQuarkusDeployment.dependencyProject.path) diff --git a/opendc-web/opendc-web-runner-quarkus/src/main/java/org/opendc/web/runner/runtime/OpenDCRunnerRecorder.java b/opendc-web/opendc-web-quarkus/src/main/java/org/opendc/web/quarkus/runtime/runner/OpenDCRunnerRecorder.java index d5d524f1..814ddf15 100644 --- a/opendc-web/opendc-web-runner-quarkus/src/main/java/org/opendc/web/runner/runtime/OpenDCRunnerRecorder.java +++ b/opendc-web/opendc-web-quarkus/src/main/java/org/opendc/web/quarkus/runtime/runner/OpenDCRunnerRecorder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 AtLarge Research + * Copyright (c) 2023 AtLarge Research * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -20,7 +20,7 @@ * SOFTWARE. */ -package org.opendc.web.runner.runtime; +package org.opendc.web.quarkus.runtime.runner; import io.quarkus.runtime.RuntimeValue; import io.quarkus.runtime.ShutdownContext; diff --git a/opendc-web/opendc-web-runner-quarkus/src/main/java/org/opendc/web/runner/runtime/OpenDCRunnerRuntimeConfig.java b/opendc-web/opendc-web-quarkus/src/main/java/org/opendc/web/quarkus/runtime/runner/OpenDCRunnerRuntimeConfig.java index 61c07e48..fbc56bfa 100644 --- a/opendc-web/opendc-web-runner-quarkus/src/main/java/org/opendc/web/runner/runtime/OpenDCRunnerRuntimeConfig.java +++ b/opendc-web/opendc-web-quarkus/src/main/java/org/opendc/web/quarkus/runtime/runner/OpenDCRunnerRuntimeConfig.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 AtLarge Research + * Copyright (c) 2023 AtLarge Research * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -20,7 +20,7 @@ * SOFTWARE. */ -package org.opendc.web.runner.runtime; +package org.opendc.web.quarkus.runtime.runner; import io.quarkus.runtime.annotations.ConfigItem; import io.quarkus.runtime.annotations.ConfigPhase; diff --git a/opendc-web/opendc-web-ui-quarkus-deployment/src/main/java/org/opendc/web/ui/deployment/AuthConfiguration.java b/opendc-web/opendc-web-quarkus/src/main/java/org/opendc/web/quarkus/runtime/ui/AuthConfiguration.java index 82e02549..10f91923 100644 --- a/opendc-web/opendc-web-ui-quarkus-deployment/src/main/java/org/opendc/web/ui/deployment/AuthConfiguration.java +++ b/opendc-web/opendc-web-quarkus/src/main/java/org/opendc/web/quarkus/runtime/ui/AuthConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 AtLarge Research + * Copyright (c) 2023 AtLarge Research * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -20,7 +20,7 @@ * SOFTWARE. */ -package org.opendc.web.ui.deployment; +package org.opendc.web.quarkus.runtime.ui; import io.quarkus.runtime.annotations.ConfigGroup; import io.quarkus.runtime.annotations.ConfigItem; diff --git a/opendc-web/opendc-web-ui-quarkus-deployment/src/main/java/org/opendc/web/ui/deployment/OpenDCUiConfig.java b/opendc-web/opendc-web-quarkus/src/main/java/org/opendc/web/quarkus/runtime/ui/OpenDCUiConfig.java index 091e60ab..541cfdc1 100644 --- a/opendc-web/opendc-web-ui-quarkus-deployment/src/main/java/org/opendc/web/ui/deployment/OpenDCUiConfig.java +++ b/opendc-web/opendc-web-quarkus/src/main/java/org/opendc/web/quarkus/runtime/ui/OpenDCUiConfig.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 AtLarge Research + * Copyright (c) 2023 AtLarge Research * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -20,24 +20,19 @@ * SOFTWARE. */ -package org.opendc.web.ui.deployment; +package org.opendc.web.quarkus.runtime.ui; import io.quarkus.runtime.annotations.ConfigItem; +import io.quarkus.runtime.annotations.ConfigPhase; import io.quarkus.runtime.annotations.ConfigRoot; import java.util.Optional; /** - * Build-time configuration for the OpenDC UI extension. + * Configuration for the OpenDC web UI. */ -@ConfigRoot(name = "opendc-ui") +@ConfigRoot(phase = ConfigPhase.RUN_TIME, name = "opendc-ui") public class OpenDCUiConfig { /** - * A flag to include the OpenDC UI extension into the build. - */ - @ConfigItem(defaultValue = "true") - boolean include; - - /** * The base URL of the OpenDC API. */ @ConfigItem(defaultValue = "/api") diff --git a/opendc-web/opendc-web-quarkus/src/main/java/org/opendc/web/quarkus/runtime/ui/OpenDCUiRecorder.java b/opendc-web/opendc-web-quarkus/src/main/java/org/opendc/web/quarkus/runtime/ui/OpenDCUiRecorder.java new file mode 100644 index 00000000..5783e431 --- /dev/null +++ b/opendc-web/opendc-web-quarkus/src/main/java/org/opendc/web/quarkus/runtime/ui/OpenDCUiRecorder.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2023 AtLarge Research + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package org.opendc.web.quarkus.runtime.ui; + +import static io.vertx.ext.web.handler.StaticHandler.DEFAULT_MAX_AGE_SECONDS; + +import io.quarkus.runtime.annotations.Recorder; +import io.vertx.core.Handler; +import io.vertx.core.http.HttpHeaders; +import io.vertx.core.http.HttpMethod; +import io.vertx.core.http.HttpServerRequest; +import io.vertx.core.json.JsonObject; +import io.vertx.ext.web.RoutingContext; +import io.vertx.ext.web.impl.Utils; + +/** + * Recorder class for the OpenDC web UI. + */ +@Recorder +public class OpenDCUiRecorder { + /** + * Construct a {@link Handler} for serving the configuration of the OpenDC web UI. + */ + public Handler<RoutingContext> configHandler(OpenDCUiConfig config) { + return (event) -> { + HttpServerRequest request = event.request(); + if (request.method() != HttpMethod.GET && request.method() != HttpMethod.HEAD) { + event.next(); + return; + } + + event.response() + .setStatusCode(200) + .putHeader(HttpHeaders.CONTENT_TYPE, "text/javascript") + .putHeader(HttpHeaders.CACHE_CONTROL, "public, immutable, max-age=" + DEFAULT_MAX_AGE_SECONDS) + .putHeader(HttpHeaders.DATE, Utils.formatRFC1123DateTime(System.currentTimeMillis())) + .end(OpenDCUiRecorder.serializeConfig(config)); + }; + } + + /** + * Serialize the configuration of the OpenDC web UI into JSON. + * + * @param config The configuration of the OpenDC web UI specified by the user. + * @return JS serialized version of the OpenDC web UI config. + */ + private static String serializeConfig(OpenDCUiConfig config) { + JsonObject configJson = JsonObject.of("NEXT_PUBLIC_API_BASE_URL", config.apiBaseUrl); + config.auth.domain.ifPresent(s -> configJson.put("NEXT_PUBLIC_AUTH0_DOMAIN", s)); + config.auth.clientId.ifPresent(s -> configJson.put("NEXT_PUBLIC_AUTH0_CLIENT_ID", s)); + config.auth.audience.ifPresent(s -> configJson.put("NEXT_PUBLIC_AUTH0_AUDIENCE", s)); + config.sentryDsn.ifPresent(s -> configJson.put("NEXT_PUBLIC_SENTRY_DSN", s)); + + return "window.__ENV = " + configJson.encode() + ";"; + } +} diff --git a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/error/MissingKotlinParameterExceptionMapper.java b/opendc-web/opendc-web-quarkus/src/main/java/org/opendc/web/quarkus/runtime/ui/QuinoaNextRoutingRecorder.java index 345acdfe..c511220d 100644 --- a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/error/MissingKotlinParameterExceptionMapper.java +++ b/opendc-web/opendc-web-quarkus/src/main/java/org/opendc/web/quarkus/runtime/ui/QuinoaNextRoutingRecorder.java @@ -20,27 +20,36 @@ * SOFTWARE. */ -package org.opendc.web.server.rest.error; +package org.opendc.web.quarkus.runtime.ui; -import com.fasterxml.jackson.module.kotlin.MissingKotlinParameterException; -import jakarta.ws.rs.core.MediaType; -import jakarta.ws.rs.core.Response; -import jakarta.ws.rs.ext.ExceptionMapper; -import jakarta.ws.rs.ext.Provider; -import org.opendc.web.proto.ProtocolError; +import io.quarkus.runtime.annotations.Recorder; +import io.vertx.core.Handler; +import io.vertx.ext.web.RoutingContext; /** - * An [ExceptionMapper] for [MissingKotlinParameterException] thrown by Jackson. + * Recorder class for building route handlers for Next.js pages and redirects. */ -@Provider -public final class MissingKotlinParameterExceptionMapper implements ExceptionMapper<MissingKotlinParameterException> { - @Override - public Response toResponse(MissingKotlinParameterException exception) { - return Response.status(Response.Status.BAD_REQUEST) - .entity(new ProtocolError( - Response.Status.BAD_REQUEST.getStatusCode(), - "Field " + exception.getParameter().getName() + " is missing from body.")) - .type(MediaType.APPLICATION_JSON) - .build(); +@Recorder +public class QuinoaNextRoutingRecorder { + /** + * Construct a {@link Handler} for serving a dynamic route of a Next.js application. + */ + public Handler<RoutingContext> pageHandler(String basePath, String page) { + return (event) -> event.reroute(basePath + page + ".html"); + } + + /** + * Construct a {@link Handler} for handling redirects of a Next.js application. + */ + public Handler<RoutingContext> redirectHandler(String destination, int statusCode) { + return (event) -> { + String query = event.request().query(); + String fullDestination = query != null ? destination + "?" + query : destination; + + event.response() + .setStatusCode(statusCode) + .putHeader("Location", fullDestination) + .end(); + }; } } diff --git a/opendc-web/opendc-web-ui-quarkus/src/main/resources/META-INF/quarkus-extension.yaml b/opendc-web/opendc-web-quarkus/src/main/resources/META-INF/quarkus-extension.yaml index 581a1779..581a1779 100644 --- a/opendc-web/opendc-web-ui-quarkus/src/main/resources/META-INF/quarkus-extension.yaml +++ b/opendc-web/opendc-web-quarkus/src/main/resources/META-INF/quarkus-extension.yaml diff --git a/opendc-web/opendc-web-runner-quarkus-deployment/build.gradle.kts b/opendc-web/opendc-web-runner-quarkus-deployment/build.gradle.kts deleted file mode 100644 index 589337f4..00000000 --- a/opendc-web/opendc-web-runner-quarkus-deployment/build.gradle.kts +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (c) 2022 AtLarge Research - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -description = "Quarkus extension for the OpenDC experiment runner" - -// Build configuration -plugins { - `java-library-conventions` -} - -dependencies { - implementation(projects.opendcWeb.opendcWebRunnerQuarkus) - implementation(projects.opendcTrace.opendcTraceApi) - - implementation(platform(libs.quarkus.bom)) - implementation(libs.quarkus.core.deployment) - implementation(libs.quarkus.arc.deployment) -} diff --git a/opendc-web/opendc-web-runner-quarkus/build.gradle.kts b/opendc-web/opendc-web-runner-quarkus/build.gradle.kts deleted file mode 100644 index 8e4e08d5..00000000 --- a/opendc-web/opendc-web-runner-quarkus/build.gradle.kts +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2022 AtLarge Research - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -description = "Quarkus extension for the OpenDC experiment runner" - -plugins { - `java-library-conventions` - id("io.quarkus.extension") -} - -quarkusExtension { - deploymentModule.set("opendc-web-runner-quarkus-deployment") -} - -dependencies { - modules { - module("javax.annotation:javax.annotation-api") { - replacedBy("jakarta.annotation:jakarta.annotation-api", "javax has been replaced by Jakarta") - } - } - - api(projects.opendcWeb.opendcWebRunner) - - implementation(platform(libs.quarkus.bom)) - implementation(libs.quarkus.core.runtime) -} - -evaluationDependsOn(projects.opendcWeb.opendcWebRunnerQuarkusDeployment.dependencyProject.path) diff --git a/opendc-web/opendc-web-runner-quarkus/src/main/resources/META-INF/quarkus-extension.yaml b/opendc-web/opendc-web-runner-quarkus/src/main/resources/META-INF/quarkus-extension.yaml deleted file mode 100644 index b93b467a..00000000 --- a/opendc-web/opendc-web-runner-quarkus/src/main/resources/META-INF/quarkus-extension.yaml +++ /dev/null @@ -1,5 +0,0 @@ ---- -name: "OpenDC Web Runner" -metadata: - status: "preview" - unlisted: true diff --git a/opendc-web/opendc-web-runner/Dockerfile b/opendc-web/opendc-web-runner/Dockerfile index 9ec184ee..d00c53fc 100644 --- a/opendc-web/opendc-web-runner/Dockerfile +++ b/opendc-web/opendc-web-runner/Dockerfile @@ -1,6 +1,5 @@ FROM eclipse-temurin:21-jdk-jammy -MAINTAINER OpenDC Maintainers <opendc@atlarge-research.com> - +LABEL org.opencontainers.image.authors="OpenDC Maintainers <opendc@atlarge-research.com>" # Obtain (cache) Gradle wrapper COPY gradlew /app/ COPY gradle /app/gradle diff --git a/opendc-web/opendc-web-runner/src/main/kotlin/org/opendc/web/runner/internal/JobManagerImpl.kt b/opendc-web/opendc-web-runner/src/main/kotlin/org/opendc/web/runner/internal/JobManagerImpl.kt index 7081041c..a0955978 100644 --- a/opendc-web/opendc-web-runner/src/main/kotlin/org/opendc/web/runner/internal/JobManagerImpl.kt +++ b/opendc-web/opendc-web-runner/src/main/kotlin/org/opendc/web/runner/internal/JobManagerImpl.kt @@ -37,7 +37,7 @@ internal class JobManagerImpl(private val client: OpenDCRunnerClient) : JobManag override fun claim(id: Long): Boolean { return try { - client.jobs.update(id, Job.Update(JobState.CLAIMED, 0)) + client.jobs.update(id, Job.Update(JobState.CLAIMED, 0, null)) true } catch (e: IllegalStateException) { false @@ -48,7 +48,7 @@ internal class JobManagerImpl(private val client: OpenDCRunnerClient) : JobManag id: Long, runtime: Int, ): Boolean { - val res = client.jobs.update(id, Job.Update(JobState.RUNNING, runtime)) + val res = client.jobs.update(id, Job.Update(JobState.RUNNING, runtime, null)) return res?.state != JobState.FAILED } @@ -56,7 +56,7 @@ internal class JobManagerImpl(private val client: OpenDCRunnerClient) : JobManag id: Long, runtime: Int, ) { - client.jobs.update(id, Job.Update(JobState.FAILED, runtime)) + client.jobs.update(id, Job.Update(JobState.FAILED, runtime, null)) } override fun finish( @@ -64,6 +64,6 @@ internal class JobManagerImpl(private val client: OpenDCRunnerClient) : JobManag runtime: Int, results: Map<String, Any>, ) { - client.jobs.update(id, Job.Update(JobState.FINISHED, runtime)) + client.jobs.update(id, Job.Update(JobState.FINISHED, runtime, results)) } } diff --git a/opendc-web/opendc-web-server/Dockerfile b/opendc-web/opendc-web-server/Dockerfile index 2aee7ddf..7e8d34c3 100644 --- a/opendc-web/opendc-web-server/Dockerfile +++ b/opendc-web/opendc-web-server/Dockerfile @@ -1,6 +1,4 @@ FROM eclipse-temurin:21-jdk-jammy -MAINTAINER OpenDC Maintainers <opendc@atlarge-research.com> - # Obtain (cache) Gradle wrapper COPY gradlew /app/ COPY gradle /app/gradle @@ -17,7 +15,10 @@ ENV OPENDC_AUTH0_AUDIENCE=$OPENDC_AUTH0_AUDIENCE ENV OPENDC_AUTH0_DOCS_CLIENT_ID=$OPENDC_AUTH0_DOCS_CLIENT_ID COPY ./ /app/ -RUN ./gradlew --no-daemon :opendc-web:opendc-web-server:quarkusBuild -Dquarkus.profile=docker +RUN curl https://raw.githubusercontent.com/creationix/nvm/master/install.sh | bash && \ + . ~/.nvm/nvm.sh && \ + nvm install --lts && \ + ./gradlew --no-daemon :opendc-web:opendc-web-server:quarkusBuild -Dquarkus.profile=docker FROM eclipse-temurin:21-jdk-jammy COPY --from=0 /app/opendc-web/opendc-web-server/build/quarkus-app /opt/opendc diff --git a/opendc-web/opendc-web-server/build.gradle.kts b/opendc-web/opendc-web-server/build.gradle.kts index 484e98c0..3a99f3ce 100644 --- a/opendc-web/opendc-web-server/build.gradle.kts +++ b/opendc-web/opendc-web-server/build.gradle.kts @@ -32,12 +32,8 @@ dependencies { implementation(enforcedPlatform(libs.quarkus.bom)) implementation(projects.opendcWeb.opendcWebProto) - testImplementation("junit:junit:4.13.1") - testImplementation("junit:junit:4.13.1") - compileOnly(projects.opendcWeb.opendcWebUiQuarkusDeployment) // Temporary fix for Quarkus/Gradle issues - compileOnly(projects.opendcWeb.opendcWebRunnerQuarkusDeployment) - implementation(projects.opendcWeb.opendcWebUiQuarkus) - implementation(projects.opendcWeb.opendcWebRunnerQuarkus) + compileOnly(projects.opendcWeb.opendcWebQuarkusDeployment) + implementation(projects.opendcWeb.opendcWebQuarkus) implementation(libs.quarkus.kotlin) implementation(libs.quarkus.resteasy.core) @@ -47,6 +43,7 @@ dependencies { implementation(libs.quarkus.security) implementation(libs.quarkus.oidc) + implementation(libs.quarkus.quinoa.runtime) implementation(libs.quarkus.hibernate.orm.core) implementation(libs.quarkus.hibernate.orm.panache) @@ -68,7 +65,7 @@ val createStartScripts by tasks.creating(CreateStartScripts::class) { applicationName = "opendc-server" mainClass.set("io.quarkus.bootstrap.runner.QuarkusEntryPoint") classpath = files("lib/quarkus-run.jar") - outputDir = project.layout.buildDirectory.get().asFile.resolve("scripts") + outputDir = project.layout.buildDirectory.dir("scripts").get().asFile } distributions { diff --git a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Job.java b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Job.java index a0ac390f..ef342e5f 100644 --- a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Job.java +++ b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Job.java @@ -28,6 +28,17 @@ import io.quarkus.hibernate.orm.panache.PanacheEntityBase; import io.quarkus.hibernate.orm.panache.PanacheQuery; import io.quarkus.panache.common.Parameters; import jakarta.persistence.*; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.FetchType; +import jakarta.persistence.ForeignKey; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.NamedQueries; +import jakarta.persistence.NamedQuery; +import jakarta.persistence.Table; import java.time.Instant; import java.util.Map; import org.hibernate.annotations.Type; diff --git a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Portfolio.java b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Portfolio.java index c2695192..80031c0a 100644 --- a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Portfolio.java +++ b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Portfolio.java @@ -51,6 +51,7 @@ import org.opendc.web.proto.Targets; */ @Entity @Table( + name = "portfolios", uniqueConstraints = { @UniqueConstraint( name = "uk_portfolios_number", diff --git a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Project.java b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Project.java index f4e5305d..ca032e21 100644 --- a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Project.java +++ b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Project.java @@ -44,7 +44,7 @@ import java.util.Set; * A project in OpenDC encapsulates all the datacenter designs and simulation runs for a set of users. */ @Entity -@Table +@Table(name = "projects") @NamedQueries({ @NamedQuery( name = "Project.findByUser", @@ -52,7 +52,7 @@ import java.util.Set; """ SELECT a FROM ProjectAuthorization a - WHERE a.key.userName = :userName + WHERE a.key.userId = :userId """), @NamedQuery( name = "Project.allocatePortfolio", diff --git a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/ProjectAuthorization.java b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/ProjectAuthorization.java index 3776ae12..ad94ad29 100644 --- a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/ProjectAuthorization.java +++ b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/ProjectAuthorization.java @@ -47,7 +47,7 @@ import org.opendc.web.proto.user.ProjectRole; * An authorization for some user to participate in a project. */ @Entity -@Table +@Table(name = "project_authorizations") @NamedQueries({ @NamedQuery( name = "ProjectAuthorization.findByUser", @@ -55,7 +55,7 @@ import org.opendc.web.proto.user.ProjectRole; """ SELECT a FROM ProjectAuthorization a - WHERE a.key.userName = :userName + WHERE a.key.userId = :userId """), }) public class ProjectAuthorization extends PanacheEntityBase { @@ -88,8 +88,8 @@ public class ProjectAuthorization extends PanacheEntityBase { /** * Construct a {@link ProjectAuthorization} object. */ - public ProjectAuthorization(Project project, String userName, ProjectRole role) { - this.key = new ProjectAuthorization.Key(project.id, userName); + public ProjectAuthorization(Project project, String userId, ProjectRole role) { + this.key = new ProjectAuthorization.Key(project.id, userId); this.project = project; this.role = role; } @@ -100,25 +100,25 @@ public class ProjectAuthorization extends PanacheEntityBase { protected ProjectAuthorization() {} /** - * List all projects for the user with the specified <code>userName</code>. + * List all projects for the user with the specified <code>userId</code>. * - * @param userName The identifier of the user that is requesting the list of projects. + * @param userId The identifier of the user that is requesting the list of projects. * @return A query returning projects that the user has received authorization for. */ - public static PanacheQuery<ProjectAuthorization> findByUser(String userName) { - return find("#ProjectAuthorization.findByUser", Parameters.with("userName", userName)); + public static PanacheQuery<ProjectAuthorization> findByUser(String userId) { + return find("#ProjectAuthorization.findByUser", Parameters.with("userId", userId)); } /** - * Find the project with <code>id</code> for the user with the specified <code>userName</code>. + * Find the project with <code>id</code> for the user with the specified <code>userId</code>. * - * @param userName The identifier of the user that is requesting the list of projects. - * @param project_id The unique identifier of the project. + * @param userId The identifier of the user that is requesting the list of projects. + * @param id The unique identifier of the project. * @return The project with the specified identifier or <code>null</code> if it does not exist or is not accessible * to the user with the specified identifier. */ - public static ProjectAuthorization findByUser(String userName, long project_id) { - return findById(new ProjectAuthorization.Key(project_id, userName)); + public static ProjectAuthorization findByUser(String userId, long id) { + return findById(new ProjectAuthorization.Key(id, userId)); } /** @@ -146,12 +146,12 @@ public class ProjectAuthorization extends PanacheEntityBase { @Column(name = "project_id", nullable = false) public long projectId; - @Column(name = "user_name", nullable = false) - public String userName; + @Column(name = "user_id", nullable = false) + public String userId; - public Key(long projectId, String userName) { + public Key(long projectId, String userId) { this.projectId = projectId; - this.userName = userName; + this.userId = userId; } protected Key() {} @@ -161,12 +161,12 @@ public class ProjectAuthorization extends PanacheEntityBase { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Key key = (Key) o; - return projectId == key.projectId && userName.equals(key.userName); + return projectId == key.projectId && userId.equals(key.userId); } @Override public int hashCode() { - return Objects.hash(projectId, userName); + return Objects.hash(projectId, userId); } } } diff --git a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Scenario.java b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Scenario.java index c79ef5bb..0224ae43 100644 --- a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Scenario.java +++ b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Scenario.java @@ -27,6 +27,20 @@ import io.quarkus.hibernate.orm.panache.PanacheEntityBase; import io.quarkus.hibernate.orm.panache.PanacheQuery; import io.quarkus.panache.common.Parameters; import jakarta.persistence.*; +import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; +import jakarta.persistence.Embedded; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.ForeignKey; +import jakarta.persistence.Index; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.NamedQueries; +import jakarta.persistence.NamedQuery; +import jakarta.persistence.OneToMany; +import jakarta.persistence.Table; +import jakarta.persistence.UniqueConstraint; import java.util.ArrayList; import java.util.List; import org.hibernate.annotations.Type; @@ -37,6 +51,7 @@ import org.opendc.web.proto.OperationalPhenomena; */ @Entity @Table( + name = "scenarios", uniqueConstraints = { @UniqueConstraint( name = "uk_scenarios_number", @@ -109,13 +124,10 @@ public class Scenario extends PanacheEntityBase { /** * Operational phenomena activated in the scenario. - * @Column(columnDefinition = "jsonb", nullable = false, updatable = false) - * @Type(JsonType.class) */ @Column(columnDefinition = "jsonb", nullable = false, updatable = false) @Type(JsonType.class) public OperationalPhenomena phenomena; - /** * The name of the VM scheduler used in the scenario. */ diff --git a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Topology.java b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Topology.java index 8a4e2ae2..ff8b4416 100644 --- a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Topology.java +++ b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/model/Topology.java @@ -41,13 +41,14 @@ import jakarta.persistence.UniqueConstraint; import java.time.Instant; import java.util.List; import org.hibernate.annotations.Type; -import org.opendc.web.proto.Room; +import org.opendc.web.proto.topology.Room; /** * A datacenter design in OpenDC. */ @Entity @Table( + name = "topologies", uniqueConstraints = { @UniqueConstraint( name = "uk_topologies_number", @@ -103,8 +104,6 @@ public class Topology extends PanacheEntityBase { /** * Datacenter design in JSON - * @Column(columnDefinition = "jsonb", nullable = false) - * @Type(JsonType.class) */ @Column(columnDefinition = "jsonb", nullable = false) @Type(JsonType.class) diff --git a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/runner/JobResource.java b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/runner/JobResource.java index 4dde8654..2b774082 100644 --- a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/runner/JobResource.java +++ b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/runner/JobResource.java @@ -98,7 +98,7 @@ public final class JobResource { } try { - jobService.updateJob(job, update.getState(), update.getRuntime(), update.getResults()); + jobService.updateJob(job, update.state(), update.runtime(), update.results()); } catch (IllegalArgumentException e) { throw new WebApplicationException(e, 400); } catch (IllegalStateException e) { diff --git a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/PortfolioResource.java b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/PortfolioResource.java index 2a3a40f4..e4d5362c 100644 --- a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/PortfolioResource.java +++ b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/PortfolioResource.java @@ -100,7 +100,7 @@ public final class PortfolioResource { var project = auth.project; int number = project.allocatePortfolio(now); - Portfolio portfolio = new Portfolio(project, number, request.getName(), request.getTargets()); + Portfolio portfolio = new Portfolio(project, number, request.name(), request.targets()); project.portfolios.add(portfolio); portfolio.persist(); diff --git a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/PortfolioScenarioResource.java b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/PortfolioScenarioResource.java index 789808c8..ea87a7ad 100644 --- a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/PortfolioScenarioResource.java +++ b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/PortfolioScenarioResource.java @@ -118,12 +118,12 @@ public final class PortfolioScenarioResource { throw new WebApplicationException("Portfolio not found", 404); } - Topology topology = Topology.findByProject(projectId, (int) request.getTopology()); + Topology topology = Topology.findByProject(projectId, (int) request.topology()); if (topology == null) { throw new WebApplicationException("Referred topology does not exist", 400); } - Trace trace = Trace.findById(request.getWorkload().getTrace()); + Trace trace = Trace.findById(request.workload().trace()); if (trace == null) { throw new WebApplicationException("Referred trace does not exist", 400); } @@ -136,14 +136,14 @@ public final class PortfolioScenarioResource { project, portfolio, number, - request.getName(), - new Workload(trace, request.getWorkload().getSamplingFraction()), + request.name(), + new Workload(trace, request.workload().samplingFraction()), topology, - request.getPhenomena(), - request.getSchedulerName()); + request.phenomena(), + request.schedulerName()); scenario.persist(); - Job job = new Job(scenario, userId, now, portfolio.targets.getRepeats()); + Job job = new Job(scenario, userId, now, portfolio.targets.repeats()); job.persist(); // Fail the job if there is not enough budget for the simulation diff --git a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/ProjectResource.java b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/ProjectResource.java index ae1c959e..40ebc666 100644 --- a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/ProjectResource.java +++ b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/ProjectResource.java @@ -79,7 +79,7 @@ public final class ProjectResource { @Consumes("application/json") public org.opendc.web.proto.user.Project create(@Valid org.opendc.web.proto.user.Project.Create request) { Instant now = Instant.now(); - Project entity = new Project(request.getName(), now); + Project entity = new Project(request.name(), now); entity.persist(); ProjectAuthorization authorization = diff --git a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/TopologyResource.java b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/TopologyResource.java index b8c542d3..25819e32 100644 --- a/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/TopologyResource.java +++ b/opendc-web/opendc-web-server/src/main/java/org/opendc/web/server/rest/user/TopologyResource.java @@ -104,7 +104,7 @@ public final class TopologyResource { Project project = auth.project; int number = project.allocateTopology(now); - Topology topology = new Topology(project, number, request.getName(), now, request.getRooms()); + Topology topology = new Topology(project, number, request.name(), now, request.rooms()); project.topologies.add(topology); topology.persist(); @@ -164,7 +164,7 @@ public final class TopologyResource { } entity.updatedAt = Instant.now(); - entity.rooms = request.getRooms(); + entity.rooms = request.rooms(); return UserProtocol.toDto(entity, auth); } diff --git a/opendc-web/opendc-web-server/src/main/resources/application-dev.properties b/opendc-web/opendc-web-server/src/main/resources/application-dev.properties index 5fbc4c04..98b1e9eb 100644 --- a/opendc-web/opendc-web-server/src/main/resources/application-dev.properties +++ b/opendc-web/opendc-web-server/src/main/resources/application-dev.properties @@ -24,11 +24,21 @@ quarkus.datasource.jdbc.url=jdbc:h2:mem:default;DB_CLOSE_DELAY=-1;INIT=CREATE TY # Hibernate quarkus.hibernate-orm.dialect=org.hibernate.dialect.H2Dialect +quarkus.hibernate-orm.log.sql=true quarkus.flyway.clean-at-start=true +quarkus.flyway.locations=db/migration,db/testing # Disable authentication +quarkus.oidc.enabled=false opendc.security.enabled=false +# Create new tables and fill them +quarkus.hibernate-orm.database.generation=drop-and-create +quarkus.hibernate-orm.sql-load-script=load_data.sql + +# Quinoa +quarkus.quinoa.dev-server=true + # Mount web UI at root and API at "/api" quarkus.resteasy.path=/api diff --git a/opendc-web/opendc-web-server/src/main/resources/application-docker.properties b/opendc-web/opendc-web-server/src/main/resources/application-docker.properties index eae9ee1e..f0b3e7dc 100644 --- a/opendc-web/opendc-web-server/src/main/resources/application-docker.properties +++ b/opendc-web/opendc-web-server/src/main/resources/application-docker.properties @@ -27,10 +27,7 @@ quarkus.datasource.password=${OPENDC_DB_PASSWORD} quarkus.datasource.jdbc.url=${OPENDC_DB_URL} # Hibernate -quarkus.hibernate-orm.dialect=org.hibernate.dialect.PostgreSQL95Dialect - -# Disable OpenDC web UI -quarkus.opendc-ui.include=false +quarkus.hibernate-orm.dialect=org.hibernate.dialect.PostgreSQLDialect # Security opendc.security.enabled=true @@ -47,3 +44,9 @@ quarkus.smallrye-openapi.security-scheme=oidc quarkus.smallrye-openapi.security-scheme-name=Auth0 quarkus.smallrye-openapi.oidc-open-id-connect-url=https://${OPENDC_AUTH0_DOMAIN:opendc.eu.auth0.com}/.well-known/openid-configuration quarkus.smallrye-openapi.servers=https://api.opendc.org + +# Enable the settings below if you want to test the docker-compose deployment locally +#quarkus.hibernate-orm.database.generation=drop-and-create +#quarkus.resteasy.path=/api +#quarkus.oidc.enabled=false +#opendc.security.enabled=false diff --git a/opendc-web/opendc-web-server/src/main/resources/application.properties b/opendc-web/opendc-web-server/src/main/resources/application.properties index 0f47db30..8daeccf3 100644 --- a/opendc-web/opendc-web-server/src/main/resources/application.properties +++ b/opendc-web/opendc-web-server/src/main/resources/application.properties @@ -22,6 +22,9 @@ quarkus.http.cors=true quarkus.http.cors.origins=http://localhost:3000,https://opendc.org +# Quinoa +quarkus.quinoa.dev-server=false + # Security quarkus.oidc.enabled=${opendc.security.enabled} diff --git a/opendc-web/opendc-web-server/src/main/resources/load_data.sql b/opendc-web/opendc-web-server/src/main/resources/load_data.sql index 72396cef..39cb3a02 100644 --- a/opendc-web/opendc-web-server/src/main/resources/load_data.sql +++ b/opendc-web/opendc-web-server/src/main/resources/load_data.sql @@ -1,56 +1,56 @@ -- Insert data -INSERT INTO PROJECT (created_at, name, portfolios_created, scenarios_created, topologies_created, updated_at, id) +INSERT INTO projects (created_at, name, portfolios_created, scenarios_created, topologies_created, updated_at, id) VALUES ('2024-03-01T15:31:41.579969Z', 'Test Project 1', 0, 0, 0, '2024-03-01T15:31:41.579969Z', 1); -INSERT INTO PROJECTAUTHORIZATION (role, project_id, user_name) +INSERT INTO project_authorizations (role, project_id, user_id) VALUES ('OWNER', 1, 'test_user_1'); -- Add test user 2 as a viewer for project 1 -INSERT INTO PROJECTAUTHORIZATION (role, project_id, user_name) +INSERT INTO project_authorizations (role, project_id, user_id) VALUES ('VIEWER', 1, 'test_user_2'); -- Add test user 3 as an editor for project 1 -INSERT INTO PROJECTAUTHORIZATION (role, project_id, user_name) +INSERT INTO project_authorizations (role, project_id, user_id) VALUES ('EDITOR', 1, 'test_user_3'); -- Create a project for test user 2 -INSERT INTO PROJECT (created_at, name, portfolios_created, scenarios_created, topologies_created, updated_at, id) +INSERT INTO projects (created_at, name, portfolios_created, scenarios_created, topologies_created, updated_at, id) VALUES ('2024-03-01T15:31:41.579969Z', 'Test Project 2', 0, 0, 0, '2024-03-01T15:31:41.579969Z', 2); -INSERT INTO PROJECTAUTHORIZATION (role, project_id, user_name) +INSERT INTO project_authorizations (role, project_id, user_id) VALUES ('OWNER', 2, 'test_user_2'); -- Create three projects for test user 3. User 3 has multiple projects to test getAll -INSERT INTO PROJECT (created_at, name, portfolios_created, scenarios_created, topologies_created, updated_at, id) +INSERT INTO projects (created_at, name, portfolios_created, scenarios_created, topologies_created, updated_at, id) VALUES ('2024-03-01T15:31:41.579969Z', 'Test Project 3', 0, 0, 0, '2024-03-01T15:31:41.579969Z', 3); -INSERT INTO PROJECTAUTHORIZATION (role, project_id, user_name) +INSERT INTO project_authorizations (role, project_id, user_id) VALUES ('OWNER', 3, 'test_user_3'); -INSERT INTO PROJECT (created_at, name, portfolios_created, scenarios_created, topologies_created, updated_at, id) +INSERT INTO projects (created_at, name, portfolios_created, scenarios_created, topologies_created, updated_at, id) VALUES ('2024-03-01T15:31:41.579969Z', 'Test Project 4', 0, 0, 0, '2024-03-01T15:31:41.579969Z', 4); -INSERT INTO PROJECTAUTHORIZATION (role, project_id, user_name) +INSERT INTO project_authorizations (role, project_id, user_id) VALUES ('OWNER', 4, 'test_user_3'); -INSERT INTO PROJECT (created_at, name, portfolios_created, scenarios_created, topologies_created, updated_at, id) +INSERT INTO projects (created_at, name, portfolios_created, scenarios_created, topologies_created, updated_at, id) VALUES ('2024-03-01T15:31:41.579969Z', 'Test Project 5', 0, 0, 0, '2024-03-01T15:31:41.579969Z', 5); -INSERT INTO PROJECTAUTHORIZATION (role, project_id, user_name) +INSERT INTO project_authorizations (role, project_id, user_id) VALUES ('OWNER', 5, 'test_user_3'); -- Project to delete -INSERT INTO PROJECT (created_at, name, portfolios_created, scenarios_created, topologies_created, updated_at, id) +INSERT INTO projects (created_at, name, portfolios_created, scenarios_created, topologies_created, updated_at, id) VALUES ('2024-03-01T15:31:41.579969Z', 'Test Project Delete', 0, 0, 0, '2024-03-01T15:31:41.579969Z', 6); -INSERT INTO PROJECTAUTHORIZATION (role, project_id, user_name) +INSERT INTO project_authorizations (role, project_id, user_id) VALUES ('OWNER', 6, 'test_user_1'); -- -------------------------------------------------------------------------------- @@ -58,16 +58,16 @@ VALUES ('OWNER', 6, 'test_user_1'); -- -------------------------------------------------------------------------------- -- Add Portfolio to project 1 -INSERT INTO PORTFOLIO (name, number, project_id, targets, id) +INSERT INTO portfolios (name, number, project_id, targets, id) VALUES ('Test PortFolio Base', 1, 1, '{"metrics": [], "repeats":1}' FORMAT JSON, 1); -INSERT INTO PORTFOLIO (name, number, project_id, targets, id) +INSERT INTO portfolios (name, number, project_id, targets, id) VALUES ('Test PortFolio Delete', 2, 1, '{"metrics": [], "repeats":1}' FORMAT JSON, 2); -INSERT INTO PORTFOLIO (name, number, project_id, targets, id) +INSERT INTO portfolios (name, number, project_id, targets, id) VALUES ('Test PortFolio DeleteEditor', 3, 1, '{"metrics": [], "repeats":1}' FORMAT JSON, 3); -UPDATE Project p +UPDATE projects p SET p.portfolios_created = 3, p.updated_at = '2024-03-01T15:31:41.579969Z' WHERE p.id = 1; @@ -75,19 +75,19 @@ WHERE p.id = 1; -- Topologies -- -------------------------------------------------------------------------------- -INSERT INTO TOPOLOGY (created_at, name, number, project_id, rooms, updated_at, id) +INSERT INTO topologies (created_at, name, number, project_id, rooms, updated_at, id) VALUES ('2024-03-01T15:31:41.579969Z', 'Test Topology testUpdate', 1, 1, '[]' FORMAT JSON, '2024-03-01T15:31:41.579969Z', 1); -INSERT INTO TOPOLOGY (created_at, name, number, project_id, rooms, updated_at, id) +INSERT INTO topologies (created_at, name, number, project_id, rooms, updated_at, id) VALUES ('2024-03-01T15:31:41.579969Z', 'Test Topology testDeleteAsEditor', 2, 1, '[]' FORMAT JSON, '2024-03-01T15:31:41.579969Z', 2); -INSERT INTO TOPOLOGY (created_at, name, number, project_id, rooms, updated_at, id) +INSERT INTO topologies (created_at, name, number, project_id, rooms, updated_at, id) VALUES ('2024-03-01T15:31:41.579969Z', 'Test Topology testDelete', 3, 1, '[]' FORMAT JSON, '2024-03-01T15:31:41.579969Z', 3); -INSERT INTO TOPOLOGY (created_at, name, number, project_id, rooms, updated_at, id) +INSERT INTO topologies (created_at, name, number, project_id, rooms, updated_at, id) VALUES ('2024-03-01T15:31:41.579969Z', 'Test Topology testDeleteUsed', 4, 1, '[]' FORMAT JSON, '2024-03-01T15:31:41.579969Z', 4); -UPDATE Project p +UPDATE projects p SET p.topologies_created = 4, p.updated_at = '2024-03-01T15:31:41.579969Z' WHERE p.id = 1; @@ -95,21 +95,21 @@ WHERE p.id = 1; -- Traces -- -------------------------------------------------------------------------------- -INSERT INTO TRACE (id, name, type) +INSERT INTO trace (id, name, type) VALUES ('bitbrains-small', 'Bitbrains Small', 'small'); -- -------------------------------------------------------------------------------- -- Scenario -- -------------------------------------------------------------------------------- -INSERT INTO SCENARIO (name, number, phenomena, portfolio_id, project_id, scheduler_name, topology_id, sampling_fraction, trace_id, id) +INSERT INTO scenarios (name, number, phenomena, portfolio_id, project_id, scheduler_name, topology_id, sampling_fraction, trace_id, id) VALUES ('Test Scenario testDelete', 1, '{"failures": false, "interference": false}' FORMAT JSON, 1, 1, 'test', 1, 1.0, 'bitbrains-small', 1); -INSERT INTO SCENARIO (name, number, phenomena, portfolio_id, project_id, scheduler_name, topology_id, sampling_fraction, trace_id, id) +INSERT INTO scenarios (name, number, phenomena, portfolio_id, project_id, scheduler_name, topology_id, sampling_fraction, trace_id, id) VALUES ('Test Scenario testDeleteUsed', 2, '{"failures": false, "interference": false}' FORMAT JSON, 1, 1, 'test', 4, 1.0, 'bitbrains-small', 2); -UPDATE Project p +UPDATE projects p SET p.scenarios_created = 2, p.updated_at = '2024-03-01T15:31:41.579969Z' WHERE p.id = 1; @@ -117,8 +117,8 @@ WHERE p.id = 1; -- Job -- -------------------------------------------------------------------------------- -INSERT INTO JOB (scenario_id, created_by, created_at, repeats, updated_at, state, runtime, results, id) +INSERT INTO job (scenario_id, created_by, created_at, repeats, updated_at, state, runtime, results, id) VALUES (1, 'test_user_1', '2024-03-01T15:31:41.579969Z', 1, '2024-03-01T15:31:41.579969Z', 'PENDING', 1, '{}' FORMAT JSON, 1); -INSERT INTO JOB (scenario_id, created_by, created_at, repeats, updated_at, state, runtime, results, id) +INSERT INTO job (scenario_id, created_by, created_at, repeats, updated_at, state, runtime, results, id) VALUES (1, 'test_user_1', '2024-03-01T15:31:41.579969Z', 1, '2024-03-01T15:31:41.579969Z', 'PENDING', 1, '{}' FORMAT JSON, 2); diff --git a/opendc-web/opendc-web-ui/.dockerignore b/opendc-web/opendc-web-server/src/main/webui/.dockerignore index b91894f6..b91894f6 100644 --- a/opendc-web/opendc-web-ui/.dockerignore +++ b/opendc-web/opendc-web-server/src/main/webui/.dockerignore diff --git a/opendc-web/opendc-web-ui/.eslintrc b/opendc-web/opendc-web-server/src/main/webui/.eslintrc index 1446fa02..1446fa02 100644 --- a/opendc-web/opendc-web-ui/.eslintrc +++ b/opendc-web/opendc-web-server/src/main/webui/.eslintrc diff --git a/opendc-web/opendc-web-ui/.gitignore b/opendc-web/opendc-web-server/src/main/webui/.gitignore index 54eada4c..0f845719 100644 --- a/opendc-web/opendc-web-ui/.gitignore +++ b/opendc-web/opendc-web-server/src/main/webui/.gitignore @@ -6,6 +6,7 @@ # Production /build +/public/__ENV.js # Misc .DS_Store diff --git a/opendc-web/opendc-web-ui/.prettierrc.yaml b/opendc-web/opendc-web-server/src/main/webui/.prettierrc.yaml index 9a2b9a95..9a2b9a95 100644 --- a/opendc-web/opendc-web-ui/.prettierrc.yaml +++ b/opendc-web/opendc-web-server/src/main/webui/.prettierrc.yaml diff --git a/opendc-web/opendc-web-ui/Dockerfile b/opendc-web/opendc-web-server/src/main/webui/Dockerfile index 24ca2b3e..6e30c96f 100644 --- a/opendc-web/opendc-web-ui/Dockerfile +++ b/opendc-web/opendc-web-server/src/main/webui/Dockerfile @@ -1,6 +1,5 @@ FROM node:18-slim AS staging -MAINTAINER OpenDC Maintainers <opendc@atlarge-research.com> - +LABEL org.opencontainers.image.authors="OpenDC Maintainers <opendc@atlarge-research.com>" # Copy package details COPY ./package.json ./package-lock.json /opendc/ RUN cd /opendc && npm ci @@ -11,21 +10,13 @@ FROM node:18-slim AS build COPY ./ /opendc COPY --from=staging /opendc/node_modules /opendc/node_modules RUN cd /opendc/ \ - # Environmental variables that will be substituted during image runtime - && export NEXT_PUBLIC_API_BASE_URL="%%NEXT_PUBLIC_API_BASE_URL%%" \ - NEXT_PUBLIC_SENTRY_DSN="%%NEXT_PUBLIC_SENTRY_DSN%%" \ - NEXT_PUBLIC_AUTH0_DOMAIN="%%NEXT_PUBLIC_AUTH0_DOMAIN%%" \ - NEXT_PUBLIC_AUTH0_CLIENT_ID="%%NEXT_PUBLIC_AUTH0_CLIENT_ID%%" \ - NEXT_PUBLIC_AUTH0_AUDIENCE="%%NEXT_PUBLIC_AUTH0_AUDIENCE%%" \ && npm run build \ - && npm cache clean --force \ - && mv build/next build/next.template - + && npm cache clean --force FROM node:18-slim COPY --from=build /opendc /opendc WORKDIR /opendc -CMD ./scripts/envsubst.sh; npm run start +CMD npm run start LABEL org.opencontainers.image.authors="OpenDC Maintainers <opendc@atlarge-research.com>" LABEL org.opencontainers.image.url="https://opendc.org" diff --git a/opendc-web/opendc-web-ui/README.md b/opendc-web/opendc-web-server/src/main/webui/README.md index a1133475..24788e37 100644 --- a/opendc-web/opendc-web-ui/README.md +++ b/opendc-web/opendc-web-server/src/main/webui/README.md @@ -10,7 +10,7 @@ dynamic components and their styles are contained in `src`. ### Pages -All pages are represented by a component in the `src/pages` directory, following +All pages are represented by a component in the `pages` directory, following the [Next.js conventions](https://nextjs.org/docs/routing/introduction) for routing. There are components for the following pages: @@ -40,8 +40,8 @@ located in `src/api`. The actual logic responsible for calling these functions i ### State Management State for the topology editor is managed via a Redux store. State is kept there in an immutable form, only to be modified through -actions being dispatched. These actions are contained in the `src/actions` folder, and the reducers (managing how state -is updated according to dispatched actions) are located in `src/reducers`. If you're not familiar with the Redux +actions being dispatched. These actions are contained in the `actions` folder, and the reducers (managing how state +is updated according to dispatched actions) are located in `reducers`. If you're not familiar with the Redux approach to state management, have a look at their [official documentation](https://redux.js.org/). ## Running the development server diff --git a/opendc-web/opendc-web-ui/src/api/index.js b/opendc-web/opendc-web-server/src/main/webui/api/index.js index 3411b96e..3411b96e 100644 --- a/opendc-web/opendc-web-ui/src/api/index.js +++ b/opendc-web/opendc-web-server/src/main/webui/api/index.js diff --git a/opendc-web/opendc-web-ui/src/api/portfolios.js b/opendc-web/opendc-web-server/src/main/webui/api/portfolios.js index d818876f..d818876f 100644 --- a/opendc-web/opendc-web-ui/src/api/portfolios.js +++ b/opendc-web/opendc-web-server/src/main/webui/api/portfolios.js diff --git a/opendc-web/opendc-web-ui/src/api/projects.js b/opendc-web/opendc-web-server/src/main/webui/api/projects.js index e7e095da..e7e095da 100644 --- a/opendc-web/opendc-web-ui/src/api/projects.js +++ b/opendc-web/opendc-web-server/src/main/webui/api/projects.js diff --git a/opendc-web/opendc-web-ui/src/api/scenarios.js b/opendc-web/opendc-web-server/src/main/webui/api/scenarios.js index 7eeb8f28..7eeb8f28 100644 --- a/opendc-web/opendc-web-ui/src/api/scenarios.js +++ b/opendc-web/opendc-web-server/src/main/webui/api/scenarios.js diff --git a/opendc-web/opendc-web-ui/src/api/schedulers.js b/opendc-web/opendc-web-server/src/main/webui/api/schedulers.js index 0b8b8153..0b8b8153 100644 --- a/opendc-web/opendc-web-ui/src/api/schedulers.js +++ b/opendc-web/opendc-web-server/src/main/webui/api/schedulers.js diff --git a/opendc-web/opendc-web-ui/src/api/topologies.js b/opendc-web/opendc-web-server/src/main/webui/api/topologies.js index 0509c6d0..0509c6d0 100644 --- a/opendc-web/opendc-web-ui/src/api/topologies.js +++ b/opendc-web/opendc-web-server/src/main/webui/api/topologies.js diff --git a/opendc-web/opendc-web-ui/src/api/traces.js b/opendc-web/opendc-web-server/src/main/webui/api/traces.js index fd637ac3..fd637ac3 100644 --- a/opendc-web/opendc-web-ui/src/api/traces.js +++ b/opendc-web/opendc-web-server/src/main/webui/api/traces.js diff --git a/opendc-web/opendc-web-ui/src/api/users.js b/opendc-web/opendc-web-server/src/main/webui/api/users.js index 12a9be05..12a9be05 100644 --- a/opendc-web/opendc-web-ui/src/api/users.js +++ b/opendc-web/opendc-web-server/src/main/webui/api/users.js diff --git a/opendc-web/opendc-web-ui/src/auth.js b/opendc-web/opendc-web-server/src/main/webui/auth.js index 8c88f526..8c88f526 100644 --- a/opendc-web/opendc-web-ui/src/auth.js +++ b/opendc-web/opendc-web-server/src/main/webui/auth.js diff --git a/opendc-web/opendc-web-ui/src/components/AppHeader.js b/opendc-web/opendc-web-server/src/main/webui/components/AppHeader.js index 514dce2a..514dce2a 100644 --- a/opendc-web/opendc-web-ui/src/components/AppHeader.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/AppHeader.js diff --git a/opendc-web/opendc-web-ui/src/components/AppHeader.module.css b/opendc-web/opendc-web-server/src/main/webui/components/AppHeader.module.css index 9d5dbed1..9d5dbed1 100644 --- a/opendc-web/opendc-web-ui/src/components/AppHeader.module.css +++ b/opendc-web/opendc-web-server/src/main/webui/components/AppHeader.module.css diff --git a/opendc-web/opendc-web-ui/src/components/AppHeaderTools.js b/opendc-web/opendc-web-server/src/main/webui/components/AppHeaderTools.js index 499bceef..499bceef 100644 --- a/opendc-web/opendc-web-ui/src/components/AppHeaderTools.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/AppHeaderTools.js diff --git a/opendc-web/opendc-web-ui/src/components/AppHeaderUser.js b/opendc-web/opendc-web-server/src/main/webui/components/AppHeaderUser.js index 3a73d9ba..3a73d9ba 100644 --- a/opendc-web/opendc-web-ui/src/components/AppHeaderUser.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/AppHeaderUser.js diff --git a/opendc-web/opendc-web-ui/src/components/AppPage.js b/opendc-web/opendc-web-server/src/main/webui/components/AppPage.js index 2893146e..2893146e 100644 --- a/opendc-web/opendc-web-ui/src/components/AppPage.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/AppPage.js diff --git a/opendc-web/opendc-web-ui/src/components/context/ContextSelectionSection.js b/opendc-web/opendc-web-server/src/main/webui/components/context/ContextSelectionSection.js index f3c25b79..f3c25b79 100644 --- a/opendc-web/opendc-web-ui/src/components/context/ContextSelectionSection.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/context/ContextSelectionSection.js diff --git a/opendc-web/opendc-web-ui/src/components/context/ContextSelectionSection.module.css b/opendc-web/opendc-web-server/src/main/webui/components/context/ContextSelectionSection.module.css index 0e902af0..0e902af0 100644 --- a/opendc-web/opendc-web-ui/src/components/context/ContextSelectionSection.module.css +++ b/opendc-web/opendc-web-server/src/main/webui/components/context/ContextSelectionSection.module.css diff --git a/opendc-web/opendc-web-ui/src/components/context/ContextSelector.js b/opendc-web/opendc-web-server/src/main/webui/components/context/ContextSelector.js index d2601008..d2601008 100644 --- a/opendc-web/opendc-web-ui/src/components/context/ContextSelector.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/context/ContextSelector.js diff --git a/opendc-web/opendc-web-ui/src/components/context/ContextSelector.module.css b/opendc-web/opendc-web-server/src/main/webui/components/context/ContextSelector.module.css index 7662d00c..7662d00c 100644 --- a/opendc-web/opendc-web-ui/src/components/context/ContextSelector.module.css +++ b/opendc-web/opendc-web-server/src/main/webui/components/context/ContextSelector.module.css diff --git a/opendc-web/opendc-web-ui/src/components/context/PortfolioSelector.js b/opendc-web/opendc-web-server/src/main/webui/components/context/PortfolioSelector.js index e401e6fc..e401e6fc 100644 --- a/opendc-web/opendc-web-ui/src/components/context/PortfolioSelector.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/context/PortfolioSelector.js diff --git a/opendc-web/opendc-web-ui/src/components/context/ProjectSelector.js b/opendc-web/opendc-web-server/src/main/webui/components/context/ProjectSelector.js index f2791b38..f2791b38 100644 --- a/opendc-web/opendc-web-ui/src/components/context/ProjectSelector.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/context/ProjectSelector.js diff --git a/opendc-web/opendc-web-ui/src/components/context/TopologySelector.js b/opendc-web/opendc-web-server/src/main/webui/components/context/TopologySelector.js index 355d9f4b..355d9f4b 100644 --- a/opendc-web/opendc-web-ui/src/components/context/TopologySelector.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/context/TopologySelector.js diff --git a/opendc-web/opendc-web-ui/src/components/portfolios/NewScenario.js b/opendc-web/opendc-web-server/src/main/webui/components/portfolios/NewScenario.js index fd9a72d2..fd9a72d2 100644 --- a/opendc-web/opendc-web-ui/src/components/portfolios/NewScenario.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/portfolios/NewScenario.js diff --git a/opendc-web/opendc-web-ui/src/components/portfolios/NewScenarioModal.js b/opendc-web/opendc-web-server/src/main/webui/components/portfolios/NewScenarioModal.js index ed35c163..ed35c163 100644 --- a/opendc-web/opendc-web-ui/src/components/portfolios/NewScenarioModal.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/portfolios/NewScenarioModal.js diff --git a/opendc-web/opendc-web-ui/src/components/portfolios/PortfolioOverview.js b/opendc-web/opendc-web-server/src/main/webui/components/portfolios/PortfolioOverview.js index e561b655..e561b655 100644 --- a/opendc-web/opendc-web-ui/src/components/portfolios/PortfolioOverview.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/portfolios/PortfolioOverview.js diff --git a/opendc-web/opendc-web-ui/src/components/portfolios/PortfolioResultInfo.js b/opendc-web/opendc-web-server/src/main/webui/components/portfolios/PortfolioResultInfo.js index dbfa928f..dbfa928f 100644 --- a/opendc-web/opendc-web-ui/src/components/portfolios/PortfolioResultInfo.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/portfolios/PortfolioResultInfo.js diff --git a/opendc-web/opendc-web-ui/src/components/portfolios/PortfolioResults.js b/opendc-web/opendc-web-server/src/main/webui/components/portfolios/PortfolioResults.js index 62150fa7..62150fa7 100644 --- a/opendc-web/opendc-web-ui/src/components/portfolios/PortfolioResults.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/portfolios/PortfolioResults.js diff --git a/opendc-web/opendc-web-ui/src/components/portfolios/ScenarioState.js b/opendc-web/opendc-web-server/src/main/webui/components/portfolios/ScenarioState.js index 99d83f64..99d83f64 100644 --- a/opendc-web/opendc-web-ui/src/components/portfolios/ScenarioState.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/portfolios/ScenarioState.js diff --git a/opendc-web/opendc-web-ui/src/components/portfolios/ScenarioTable.js b/opendc-web/opendc-web-server/src/main/webui/components/portfolios/ScenarioTable.js index b068d045..b068d045 100644 --- a/opendc-web/opendc-web-ui/src/components/portfolios/ScenarioTable.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/portfolios/ScenarioTable.js diff --git a/opendc-web/opendc-web-ui/src/components/projects/FilterPanel.js b/opendc-web/opendc-web-server/src/main/webui/components/projects/FilterPanel.js index 5aaa56ac..5aaa56ac 100644 --- a/opendc-web/opendc-web-ui/src/components/projects/FilterPanel.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/projects/FilterPanel.js diff --git a/opendc-web/opendc-web-ui/src/components/projects/FilterPanel.module.css b/opendc-web/opendc-web-server/src/main/webui/components/projects/FilterPanel.module.css index 15c36821..15c36821 100644 --- a/opendc-web/opendc-web-ui/src/components/projects/FilterPanel.module.css +++ b/opendc-web/opendc-web-server/src/main/webui/components/projects/FilterPanel.module.css diff --git a/opendc-web/opendc-web-ui/src/components/projects/NewPortfolio.js b/opendc-web/opendc-web-server/src/main/webui/components/projects/NewPortfolio.js index aebcc3c9..aebcc3c9 100644 --- a/opendc-web/opendc-web-ui/src/components/projects/NewPortfolio.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/projects/NewPortfolio.js diff --git a/opendc-web/opendc-web-ui/src/components/projects/NewPortfolioModal.js b/opendc-web/opendc-web-server/src/main/webui/components/projects/NewPortfolioModal.js index ba4bc819..ba4bc819 100644 --- a/opendc-web/opendc-web-ui/src/components/projects/NewPortfolioModal.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/projects/NewPortfolioModal.js diff --git a/opendc-web/opendc-web-ui/src/components/projects/NewTopology.js b/opendc-web/opendc-web-server/src/main/webui/components/projects/NewTopology.js index 4c569c56..4c569c56 100644 --- a/opendc-web/opendc-web-ui/src/components/projects/NewTopology.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/projects/NewTopology.js diff --git a/opendc-web/opendc-web-ui/src/components/projects/NewTopologyModal.js b/opendc-web/opendc-web-server/src/main/webui/components/projects/NewTopologyModal.js index 780ec034..780ec034 100644 --- a/opendc-web/opendc-web-ui/src/components/projects/NewTopologyModal.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/projects/NewTopologyModal.js diff --git a/opendc-web/opendc-web-ui/src/components/projects/PortfolioTable.js b/opendc-web/opendc-web-server/src/main/webui/components/projects/PortfolioTable.js index 0afeaeaf..0afeaeaf 100644 --- a/opendc-web/opendc-web-ui/src/components/projects/PortfolioTable.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/projects/PortfolioTable.js diff --git a/opendc-web/opendc-web-ui/src/components/projects/ProjectCollection.js b/opendc-web/opendc-web-server/src/main/webui/components/projects/ProjectCollection.js index a26fed46..a26fed46 100644 --- a/opendc-web/opendc-web-ui/src/components/projects/ProjectCollection.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/projects/ProjectCollection.js diff --git a/opendc-web/opendc-web-ui/src/components/projects/ProjectOverview.js b/opendc-web/opendc-web-server/src/main/webui/components/projects/ProjectOverview.js index 3e1656f6..3e1656f6 100644 --- a/opendc-web/opendc-web-ui/src/components/projects/ProjectOverview.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/projects/ProjectOverview.js diff --git a/opendc-web/opendc-web-ui/src/components/projects/TopologyTable.js b/opendc-web/opendc-web-server/src/main/webui/components/projects/TopologyTable.js index 1c2c4f04..1c2c4f04 100644 --- a/opendc-web/opendc-web-ui/src/components/projects/TopologyTable.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/projects/TopologyTable.js diff --git a/opendc-web/opendc-web-ui/src/components/topologies/RoomTable.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/RoomTable.js index 7f7b4171..7f7b4171 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/RoomTable.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/RoomTable.js diff --git a/opendc-web/opendc-web-ui/src/components/topologies/TopologyMap.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/TopologyMap.js index ff583750..ff583750 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/TopologyMap.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/TopologyMap.js diff --git a/opendc-web/opendc-web-ui/src/components/topologies/TopologyOverview.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/TopologyOverview.js index f8ee4990..f8ee4990 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/TopologyOverview.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/TopologyOverview.js diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/GrayContainer.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/GrayContainer.js index ccf637e5..ccf637e5 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/map/GrayContainer.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/GrayContainer.js diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/MapConstants.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/MapConstants.js index 4c3b2757..4c3b2757 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/map/MapConstants.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/MapConstants.js diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/MapStage.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/MapStage.js index e2b626ec..e2b626ec 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/map/MapStage.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/MapStage.js diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/MapStage.module.css b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/MapStage.module.css index 47c3dde2..47c3dde2 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/map/MapStage.module.css +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/MapStage.module.css diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/RackContainer.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/RackContainer.js index 14449a91..14449a91 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/map/RackContainer.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/RackContainer.js diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/RackEnergyFillContainer.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/RackEnergyFillContainer.js index a1ca7426..a1ca7426 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/map/RackEnergyFillContainer.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/RackEnergyFillContainer.js diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/RackSpaceFillContainer.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/RackSpaceFillContainer.js index 2039a9d3..2039a9d3 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/map/RackSpaceFillContainer.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/RackSpaceFillContainer.js diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/RoomContainer.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/RoomContainer.js index 76785bea..76785bea 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/map/RoomContainer.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/RoomContainer.js diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/TileContainer.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/TileContainer.js index 0788b894..0788b894 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/map/TileContainer.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/TileContainer.js diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/TopologyContainer.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/TopologyContainer.js index cc0d46b3..cc0d46b3 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/map/TopologyContainer.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/TopologyContainer.js diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/WallContainer.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/WallContainer.js index 106d8d3d..106d8d3d 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/map/WallContainer.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/WallContainer.js diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/controls/Collapse.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/controls/Collapse.js index 931ded94..931ded94 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/map/controls/Collapse.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/controls/Collapse.js diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/controls/Collapse.module.css b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/controls/Collapse.module.css index 70fd465f..70fd465f 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/map/controls/Collapse.module.css +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/controls/Collapse.module.css diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/controls/ScaleIndicator.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/controls/ScaleIndicator.js index 3ec893fb..3ec893fb 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/map/controls/ScaleIndicator.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/controls/ScaleIndicator.js diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/controls/ScaleIndicator.module.css b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/controls/ScaleIndicator.module.css index f19e0ff2..f19e0ff2 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/map/controls/ScaleIndicator.module.css +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/controls/ScaleIndicator.module.css diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/controls/Toolbar.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/controls/Toolbar.js index 00aaf3e1..00aaf3e1 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/map/controls/Toolbar.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/controls/Toolbar.js diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/controls/Toolbar.module.css b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/controls/Toolbar.module.css index 007389da..007389da 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/map/controls/Toolbar.module.css +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/controls/Toolbar.module.css diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/elements/Backdrop.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/elements/Backdrop.js index 93037b51..93037b51 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/map/elements/Backdrop.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/elements/Backdrop.js diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/elements/GrayLayer.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/elements/GrayLayer.js index 08c687f6..08c687f6 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/map/elements/GrayLayer.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/elements/GrayLayer.js diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/elements/HoverTile.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/elements/HoverTile.js index 20c2c6d1..20c2c6d1 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/map/elements/HoverTile.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/elements/HoverTile.js diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/elements/ImageComponent.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/elements/ImageComponent.js index fdae53f2..fdae53f2 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/map/elements/ImageComponent.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/elements/ImageComponent.js diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/elements/RackFillBar.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/elements/RackFillBar.js index aa284944..aa284944 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/map/elements/RackFillBar.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/elements/RackFillBar.js diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/elements/RoomTile.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/elements/RoomTile.js index e7329dc0..e7329dc0 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/map/elements/RoomTile.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/elements/RoomTile.js diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/elements/TileObject.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/elements/TileObject.js index 3211f187..3211f187 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/map/elements/TileObject.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/elements/TileObject.js diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/elements/TilePlusIcon.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/elements/TilePlusIcon.js index 186c2b3a..186c2b3a 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/map/elements/TilePlusIcon.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/elements/TilePlusIcon.js diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/elements/WallSegment.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/elements/WallSegment.js index 4f18813e..4f18813e 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/map/elements/WallSegment.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/elements/WallSegment.js diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/groups/GridGroup.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/groups/GridGroup.js index d66a18de..d66a18de 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/map/groups/GridGroup.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/groups/GridGroup.js diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/groups/RackGroup.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/groups/RackGroup.js index ed942661..ed942661 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/map/groups/RackGroup.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/groups/RackGroup.js diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/groups/RoomGroup.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/groups/RoomGroup.js index 3f8b3089..3f8b3089 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/map/groups/RoomGroup.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/groups/RoomGroup.js diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/groups/TileGroup.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/groups/TileGroup.js index f2084017..f2084017 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/map/groups/TileGroup.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/groups/TileGroup.js diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/groups/TopologyGroup.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/groups/TopologyGroup.js index 011dcf34..011dcf34 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/map/groups/TopologyGroup.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/groups/TopologyGroup.js diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/groups/WallGroup.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/groups/WallGroup.js index 6cbd1cd0..6cbd1cd0 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/map/groups/WallGroup.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/groups/WallGroup.js diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/layers/HoverLayerComponent.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/layers/HoverLayerComponent.js index d7e0c56a..d7e0c56a 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/map/layers/HoverLayerComponent.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/layers/HoverLayerComponent.js diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/layers/MapLayer.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/layers/MapLayer.js index c902532b..c902532b 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/map/layers/MapLayer.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/layers/MapLayer.js diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/layers/ObjectHoverLayer.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/layers/ObjectHoverLayer.js index 5e741a3b..5e741a3b 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/map/layers/ObjectHoverLayer.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/layers/ObjectHoverLayer.js diff --git a/opendc-web/opendc-web-ui/src/components/topologies/map/layers/RoomHoverLayer.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/layers/RoomHoverLayer.js index b9cfcaf4..b9cfcaf4 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/map/layers/RoomHoverLayer.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/map/layers/RoomHoverLayer.js diff --git a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/NameComponent.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/NameComponent.js index ececd07b..ececd07b 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/NameComponent.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/NameComponent.js diff --git a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/TopologySidebar.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/TopologySidebar.js index 5aaa7834..5aaa7834 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/TopologySidebar.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/TopologySidebar.js diff --git a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/TopologySidebar.module.css b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/TopologySidebar.module.css index 3853c625..3853c625 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/TopologySidebar.module.css +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/TopologySidebar.module.css diff --git a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/building/BuildingSidebar.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/building/BuildingSidebar.js index 5fcd46be..5fcd46be 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/building/BuildingSidebar.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/building/BuildingSidebar.js diff --git a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/building/NewRoomConstructionComponent.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/building/NewRoomConstructionComponent.js index 9fc85d0c..9fc85d0c 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/building/NewRoomConstructionComponent.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/building/NewRoomConstructionComponent.js diff --git a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/building/NewRoomConstructionContainer.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/building/NewRoomConstructionContainer.js index c149b224..c149b224 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/building/NewRoomConstructionContainer.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/building/NewRoomConstructionContainer.js diff --git a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/machine/DeleteMachine.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/machine/DeleteMachine.js index a4b9457b..a4b9457b 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/machine/DeleteMachine.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/machine/DeleteMachine.js diff --git a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/machine/MachineSidebar.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/machine/MachineSidebar.js index 8a4c33dc..8a4c33dc 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/machine/MachineSidebar.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/machine/MachineSidebar.js diff --git a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/machine/UnitAddComponent.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/machine/UnitAddComponent.js index 18cba23a..18cba23a 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/machine/UnitAddComponent.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/machine/UnitAddComponent.js diff --git a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/machine/UnitAddContainer.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/machine/UnitAddContainer.js index a0054ef6..a0054ef6 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/machine/UnitAddContainer.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/machine/UnitAddContainer.js diff --git a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/machine/UnitListComponent.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/machine/UnitListComponent.js index 75ab0ad7..75ab0ad7 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/machine/UnitListComponent.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/machine/UnitListComponent.js diff --git a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/machine/UnitListContainer.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/machine/UnitListContainer.js index bcd4bdcc..bcd4bdcc 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/machine/UnitListContainer.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/machine/UnitListContainer.js diff --git a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/machine/UnitTabsComponent.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/machine/UnitTabsComponent.js index 4032d607..4032d607 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/machine/UnitTabsComponent.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/machine/UnitTabsComponent.js diff --git a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/machine/UnitType.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/machine/UnitType.js index b6d7bf8b..b6d7bf8b 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/machine/UnitType.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/machine/UnitType.js diff --git a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/rack/AddPrefab.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/rack/AddPrefab.js index 6a0c3ff3..6a0c3ff3 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/rack/AddPrefab.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/rack/AddPrefab.js diff --git a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/rack/DeleteRackContainer.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/rack/DeleteRackContainer.js index 0583a7a4..0583a7a4 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/rack/DeleteRackContainer.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/rack/DeleteRackContainer.js diff --git a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/rack/MachineComponent.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/rack/MachineComponent.js index b0a96a9f..b0a96a9f 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/rack/MachineComponent.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/rack/MachineComponent.js diff --git a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/rack/MachineListComponent.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/rack/MachineListComponent.js index 02c97730..02c97730 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/rack/MachineListComponent.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/rack/MachineListComponent.js diff --git a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/rack/MachineListContainer.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/rack/MachineListContainer.js index e1914730..e1914730 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/rack/MachineListContainer.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/rack/MachineListContainer.js diff --git a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/rack/RackNameContainer.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/rack/RackNameContainer.js index c3422318..c3422318 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/rack/RackNameContainer.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/rack/RackNameContainer.js diff --git a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/rack/RackSidebar.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/rack/RackSidebar.js index cb7d3b68..cb7d3b68 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/rack/RackSidebar.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/rack/RackSidebar.js diff --git a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/rack/RackSidebar.module.css b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/rack/RackSidebar.module.css index f4c8829f..f4c8829f 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/rack/RackSidebar.module.css +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/rack/RackSidebar.module.css diff --git a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/room/DeleteRoomContainer.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/room/DeleteRoomContainer.js index 29b8f78a..29b8f78a 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/room/DeleteRoomContainer.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/room/DeleteRoomContainer.js diff --git a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/room/EditRoomContainer.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/room/EditRoomContainer.js index 7a278cd6..7a278cd6 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/room/EditRoomContainer.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/room/EditRoomContainer.js diff --git a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/room/RackConstructionComponent.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/room/RackConstructionComponent.js index a384d5d5..a384d5d5 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/room/RackConstructionComponent.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/room/RackConstructionComponent.js diff --git a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/room/RackConstructionContainer.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/room/RackConstructionContainer.js index e04287a5..e04287a5 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/room/RackConstructionContainer.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/room/RackConstructionContainer.js diff --git a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/room/RoomName.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/room/RoomName.js index 72d45bea..72d45bea 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/room/RoomName.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/room/RoomName.js diff --git a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/room/RoomSidebar.js b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/room/RoomSidebar.js index 6ad489e0..6ad489e0 100644 --- a/opendc-web/opendc-web-ui/src/components/topologies/sidebar/room/RoomSidebar.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/topologies/sidebar/room/RoomSidebar.js diff --git a/opendc-web/opendc-web-ui/src/components/util/TableEmptyState.js b/opendc-web/opendc-web-server/src/main/webui/components/util/TableEmptyState.js index 9d16ffbb..9d16ffbb 100644 --- a/opendc-web/opendc-web-ui/src/components/util/TableEmptyState.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/util/TableEmptyState.js diff --git a/opendc-web/opendc-web-ui/src/components/util/modals/ConfirmationModal.js b/opendc-web/opendc-web-server/src/main/webui/components/util/modals/ConfirmationModal.js index f6e1c98b..f6e1c98b 100644 --- a/opendc-web/opendc-web-ui/src/components/util/modals/ConfirmationModal.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/util/modals/ConfirmationModal.js diff --git a/opendc-web/opendc-web-ui/src/components/util/modals/Modal.js b/opendc-web/opendc-web-server/src/main/webui/components/util/modals/Modal.js index d4577062..d4577062 100644 --- a/opendc-web/opendc-web-ui/src/components/util/modals/Modal.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/util/modals/Modal.js diff --git a/opendc-web/opendc-web-ui/src/components/util/modals/TextInputModal.js b/opendc-web/opendc-web-server/src/main/webui/components/util/modals/TextInputModal.js index 392a729e..392a729e 100644 --- a/opendc-web/opendc-web-ui/src/components/util/modals/TextInputModal.js +++ b/opendc-web/opendc-web-server/src/main/webui/components/util/modals/TextInputModal.js diff --git a/opendc-web/opendc-web-ui/src/config.js b/opendc-web/opendc-web-server/src/main/webui/config.js index 52952d69..1a0ba02c 100644 --- a/opendc-web/opendc-web-ui/src/config.js +++ b/opendc-web/opendc-web-server/src/main/webui/config.js @@ -20,22 +20,24 @@ * SOFTWARE. */ +import { env } from 'next-runtime-env'; + /** * URL to OpenDC API. */ -export const apiUrl = process.env.NEXT_PUBLIC_API_BASE_URL +export const apiUrl = env("NEXT_PUBLIC_API_BASE_URL") /** * Authentication configuration. */ export const auth = { - domain: process.env.NEXT_PUBLIC_AUTH0_DOMAIN, - clientId: process.env.NEXT_PUBLIC_AUTH0_CLIENT_ID, - audience: process.env.NEXT_PUBLIC_AUTH0_AUDIENCE, + domain: env("NEXT_PUBLIC_AUTH0_DOMAIN"), + clientId: env("NEXT_PUBLIC_AUTH0_CLIENT_ID"), + audience: env("NEXT_PUBLIC_AUTH0_AUDIENCE"), redirectUri: global.window && global.window.location.origin, } /** * Sentry DSN for web frontend. */ -export const sentryDsn = process.env.NEXT_PUBLIC_SENTRY_DSN +export const sentryDsn = env("NEXT_PUBLIC_SENTRY_DSN") diff --git a/opendc-web/opendc-web-ui/src/data/experiments.js b/opendc-web/opendc-web-server/src/main/webui/data/experiments.js index ca8912a2..ca8912a2 100644 --- a/opendc-web/opendc-web-ui/src/data/experiments.js +++ b/opendc-web/opendc-web-server/src/main/webui/data/experiments.js diff --git a/opendc-web/opendc-web-ui/src/data/project.js b/opendc-web/opendc-web-server/src/main/webui/data/project.js index 60a8fab6..60a8fab6 100644 --- a/opendc-web/opendc-web-ui/src/data/project.js +++ b/opendc-web/opendc-web-server/src/main/webui/data/project.js diff --git a/opendc-web/opendc-web-ui/src/data/query.js b/opendc-web/opendc-web-server/src/main/webui/data/query.js index 3e5423b9..3e5423b9 100644 --- a/opendc-web/opendc-web-ui/src/data/query.js +++ b/opendc-web/opendc-web-server/src/main/webui/data/query.js diff --git a/opendc-web/opendc-web-ui/src/data/topology.js b/opendc-web/opendc-web-server/src/main/webui/data/topology.js index d5e624d5..d5e624d5 100644 --- a/opendc-web/opendc-web-ui/src/data/topology.js +++ b/opendc-web/opendc-web-server/src/main/webui/data/topology.js diff --git a/opendc-web/opendc-web-ui/src/data/user.js b/opendc-web/opendc-web-server/src/main/webui/data/user.js index 97c0e1e2..97c0e1e2 100644 --- a/opendc-web/opendc-web-ui/src/data/user.js +++ b/opendc-web/opendc-web-server/src/main/webui/data/user.js diff --git a/opendc-web/opendc-web-ui/next.config.js b/opendc-web/opendc-web-server/src/main/webui/next.config.js index f761ba74..a11b4778 100644 --- a/opendc-web/opendc-web-ui/next.config.js +++ b/opendc-web/opendc-web-server/src/main/webui/next.config.js @@ -23,13 +23,16 @@ // PatternFly 4 uses global CSS imports in its distribution files. Therefore, // we need to transpile the modules before we can use them. const { withGlobalCss } = require('next-global-css') -const { PHASE_DEVELOPMENT_SERVER } = require("next/constants"); const withConfig = withGlobalCss() +// Generate dynamic env file +const { configureRuntimeEnv } = require('next-runtime-env/build/configure'); + +configureRuntimeEnv(); + module.exports = (phase) => withConfig({ basePath: process.env.NEXT_BASE_PATH && '/' + process.env.NEXT_BASE_PATH, reactStrictMode: true, - distDir: phase === PHASE_DEVELOPMENT_SERVER ? 'build/next-dev' : 'build/next', async redirects() { return [ { diff --git a/opendc-web/opendc-web-ui/package-lock.json b/opendc-web/opendc-web-server/src/main/webui/package-lock.json index 5d78081e..71add29b 100644 --- a/opendc-web/opendc-web-ui/package-lock.json +++ b/opendc-web/opendc-web-server/src/main/webui/package-lock.json @@ -22,6 +22,7 @@ "mathjs": "^11.7.0", "next": "^13.5.4", "next-global-css": "^1.3.1", + "next-runtime-env": "^1.7.1", "normalizr": "^3.6.2", "prettier": "^2.8.7", "prop-types": "^15.8.1", @@ -932,7 +933,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -1175,7 +1175,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -1204,7 +1203,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -1215,8 +1213,7 @@ "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/complex.js": { "version": "2.1.1", @@ -2391,7 +2388,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "engines": { "node": ">=8" } @@ -3105,6 +3101,24 @@ "resolved": "https://registry.npmjs.org/next-global-css/-/next-global-css-1.3.1.tgz", "integrity": "sha512-+OnTwQKmv1lDP7r4R3T94oq6372R9UGVivchBQu49j7ZjzvSXHCnv93yAuhgMkvUgAbGifTs8sQ5YL9wjyAxfA==" }, + "node_modules/next-runtime-env": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/next-runtime-env/-/next-runtime-env-1.7.1.tgz", + "integrity": "sha512-KIWciYVcYBoc0dBTyx7tEogyESacAJCkseU9+AcIYbkq3MiV6WyhHHPfDONpXbJSlpT3u3utrSrngua2EFlfyA==", + "dependencies": { + "chalk": "^4.1.2" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "optional": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/normalizr": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/normalizr/-/normalizr-3.6.2.tgz", @@ -3990,7 +4004,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -4661,5 +4674,3473 @@ "url": "https://github.com/sponsors/sindresorhus" } } + }, + "dependencies": { + "@auth0/auth0-react": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@auth0/auth0-react/-/auth0-react-1.12.1.tgz", + "integrity": "sha512-8+ecK/4rE0AGsxLW2IDcr1oPbT55tuE6cQEzEIOkQjB6QGQxxWMzQy0D4nMKw3JUAc7nYcFVOABNFNbc471n9Q==", + "requires": { + "@auth0/auth0-spa-js": "^1.22.6" + } + }, + "@auth0/auth0-spa-js": { + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/@auth0/auth0-spa-js/-/auth0-spa-js-1.22.6.tgz", + "integrity": "sha512-iL3O0vWanfKFVgy1J2ZHDPlAUK6EVHWEHWS6mUXwHEuPiK39tjlQtyUKQIJI1F5YsZB75ijGgRWMTawSDXlwCA==", + "requires": { + "abortcontroller-polyfill": "^1.7.3", + "browser-tabs-lock": "^1.2.15", + "core-js": "^3.25.4", + "es-cookie": "~1.3.2", + "fast-text-encoding": "^1.0.6", + "promise-polyfill": "^8.2.3", + "unfetch": "^4.2.0" + } + }, + "@babel/runtime": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", + "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", + "requires": { + "regenerator-runtime": "^0.13.11" + } + }, + "@babel/runtime-corejs3": { + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.19.6.tgz", + "integrity": "sha512-oWNn1ZlGde7b4i/3tnixpH9qI0bOAACiUs+KEES4UUCnsPjVWFlWdLV/iwJuPC2qp3EowbAqsm+0XqNwnwYhxA==", + "dev": true, + "requires": { + "core-js-pure": "^3.25.1", + "regenerator-runtime": "^0.13.4" + } + }, + "@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^3.3.0" + } + }, + "@eslint-community/regexpp": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.4.1.tgz", + "integrity": "sha512-BISJ6ZE4xQsuL/FmsyRaiffpq977bMlsKfGHTQrOGFErfByxIe6iZTxPf/00Zon9b9a7iUykfQwejN3s2ZW/Bw==", + "dev": true + }, + "@eslint/eslintrc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.1.tgz", + "integrity": "sha512-eFRmABvW2E5Ho6f5fHLqgena46rOj7r7OKHYfLElqcBfGFHHpjBhivyi5+jOEQuSpdc/1phIZJlbC2te+tZNIw==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.5.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + } + }, + "@eslint/js": { + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.36.0.tgz", + "integrity": "sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg==", + "dev": true + }, + "@humanwhocodes/config-array": { + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + } + }, + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "@juggle/resize-observer": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.4.0.tgz", + "integrity": "sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==" + }, + "@next/env": { + "version": "13.5.4", + "resolved": "https://registry.npmjs.org/@next/env/-/env-13.5.4.tgz", + "integrity": "sha512-LGegJkMvRNw90WWphGJ3RMHMVplYcOfRWf2Be3td3sUa+1AaxmsYyANsA+znrGCBjXJNi4XAQlSoEfUxs/4kIQ==" + }, + "@next/eslint-plugin-next": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.2.4.tgz", + "integrity": "sha512-ck1lI+7r1mMJpqLNa3LJ5pxCfOB1lfJncKmRJeJxcJqcngaFwylreLP7da6Rrjr6u2gVRTfmnkSkjc80IiQCwQ==", + "dev": true, + "requires": { + "glob": "7.1.7" + } + }, + "@next/swc-darwin-arm64": { + "version": "13.5.4", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.5.4.tgz", + "integrity": "sha512-Df8SHuXgF1p+aonBMcDPEsaahNo2TCwuie7VXED4FVyECvdXfRT9unapm54NssV9tF3OQFKBFOdlje4T43VO0w==", + "optional": true + }, + "@next/swc-darwin-x64": { + "version": "13.5.4", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.5.4.tgz", + "integrity": "sha512-siPuUwO45PnNRMeZnSa8n/Lye5ZX93IJom9wQRB5DEOdFrw0JjOMu1GINB8jAEdwa7Vdyn1oJ2xGNaQpdQQ9Pw==", + "optional": true + }, + "@next/swc-linux-arm64-gnu": { + "version": "13.5.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.5.4.tgz", + "integrity": "sha512-l/k/fvRP/zmB2jkFMfefmFkyZbDkYW0mRM/LB+tH5u9pB98WsHXC0WvDHlGCYp3CH/jlkJPL7gN8nkTQVrQ/2w==", + "optional": true + }, + "@next/swc-linux-arm64-musl": { + "version": "13.5.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.5.4.tgz", + "integrity": "sha512-YYGb7SlLkI+XqfQa8VPErljb7k9nUnhhRrVaOdfJNCaQnHBcvbT7cx/UjDQLdleJcfyg1Hkn5YSSIeVfjgmkTg==", + "optional": true + }, + "@next/swc-linux-x64-gnu": { + "version": "13.5.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.5.4.tgz", + "integrity": "sha512-uE61vyUSClnCH18YHjA8tE1prr/PBFlBFhxBZis4XBRJoR+txAky5d7gGNUIbQ8sZZ7LVkSVgm/5Fc7mwXmRAg==", + "optional": true + }, + "@next/swc-linux-x64-musl": { + "version": "13.5.4", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.5.4.tgz", + "integrity": "sha512-qVEKFYML/GvJSy9CfYqAdUexA6M5AklYcQCW+8JECmkQHGoPxCf04iMh7CPR7wkHyWWK+XLt4Ja7hhsPJtSnhg==", + "optional": true + }, + "@next/swc-win32-arm64-msvc": { + "version": "13.5.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.5.4.tgz", + "integrity": "sha512-mDSQfqxAlfpeZOLPxLymZkX0hYF3juN57W6vFHTvwKlnHfmh12Pt7hPIRLYIShk8uYRsKPtMTth/EzpwRI+u8w==", + "optional": true + }, + "@next/swc-win32-ia32-msvc": { + "version": "13.5.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.5.4.tgz", + "integrity": "sha512-aoqAT2XIekIWoriwzOmGFAvTtVY5O7JjV21giozBTP5c6uZhpvTWRbmHXbmsjZqY4HnEZQRXWkSAppsIBweKqw==", + "optional": true + }, + "@next/swc-win32-x64-msvc": { + "version": "13.5.4", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.5.4.tgz", + "integrity": "sha512-cyRvlAxwlddlqeB9xtPSfNSCRy8BOa4wtMo0IuI9P7Y0XT2qpDrpFKRyZ7kUngZis59mPVla5k8X1oOJ8RxDYg==", + "optional": true + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@patternfly/react-charts": { + "version": "6.94.18", + "resolved": "https://registry.npmjs.org/@patternfly/react-charts/-/react-charts-6.94.18.tgz", + "integrity": "sha512-56WxnZYC3blRX41mW67JaPxJ3YhXViLvwGpEsZrYCccla/rTV8JgKK0gjHnqtzPQiVBfpn+3ewOyNCOR5uRoSw==", + "requires": { + "@patternfly/react-styles": "^4.92.6", + "@patternfly/react-tokens": "^4.94.6", + "hoist-non-react-statics": "^3.3.0", + "lodash": "^4.17.19", + "tslib": "^2.0.0", + "victory-area": "^36.6.7", + "victory-axis": "^36.6.7", + "victory-bar": "^36.6.7", + "victory-chart": "^36.6.7", + "victory-core": "^36.6.7", + "victory-create-container": "^36.6.7", + "victory-cursor-container": "^36.6.7", + "victory-group": "^36.6.7", + "victory-legend": "^36.6.7", + "victory-line": "^36.6.7", + "victory-pie": "^36.6.7", + "victory-scatter": "^36.6.7", + "victory-stack": "^36.6.7", + "victory-tooltip": "^36.6.7", + "victory-voronoi-container": "^36.6.7", + "victory-zoom-container": "^36.6.7" + } + }, + "@patternfly/react-core": { + "version": "4.276.6", + "resolved": "https://registry.npmjs.org/@patternfly/react-core/-/react-core-4.276.6.tgz", + "integrity": "sha512-G0K+378jf9jw9g+hCAoKnsAe/UGTRspqPeuAYypF2FgNr+dC7dUpc7/VkNhZBVqSJzUWVEK8NyXcqkfi0IemIg==", + "requires": { + "@patternfly/react-icons": "^4.93.6", + "@patternfly/react-styles": "^4.92.6", + "@patternfly/react-tokens": "^4.94.6", + "focus-trap": "6.9.2", + "react-dropzone": "9.0.0", + "tippy.js": "5.1.2", + "tslib": "^2.0.0" + } + }, + "@patternfly/react-icons": { + "version": "4.93.6", + "resolved": "https://registry.npmjs.org/@patternfly/react-icons/-/react-icons-4.93.6.tgz", + "integrity": "sha512-ZrXegc/81oiuTIeWvoHb3nG/eZODbB4rYmekBEsrbiysyO7m/sUFoi/RLvgFINrRoh6YCJqL5fj06Jg6d7jX1g==", + "requires": {} + }, + "@patternfly/react-styles": { + "version": "4.92.6", + "resolved": "https://registry.npmjs.org/@patternfly/react-styles/-/react-styles-4.92.6.tgz", + "integrity": "sha512-b8uQdEReMyeoMzjpMri845QxqtupY/tIFFYfVeKoB2neno8gkcW1RvDdDe62LF88q45OktCwAe/8A99ker10Iw==" + }, + "@patternfly/react-table": { + "version": "4.112.39", + "resolved": "https://registry.npmjs.org/@patternfly/react-table/-/react-table-4.112.39.tgz", + "integrity": "sha512-U+hOMgYlbghGH4M5MX+qt0GkVi/ocrGnxDnm11YiS3CtEGsd6Rr0NeqMmk0uoR46Od4Pr5tKuXxZhPP32sCL/w==", + "requires": { + "@patternfly/react-core": "^4.276.6", + "@patternfly/react-icons": "^4.93.6", + "@patternfly/react-styles": "^4.92.6", + "@patternfly/react-tokens": "^4.94.6", + "lodash": "^4.17.19", + "tslib": "^2.0.0" + } + }, + "@patternfly/react-tokens": { + "version": "4.94.6", + "resolved": "https://registry.npmjs.org/@patternfly/react-tokens/-/react-tokens-4.94.6.tgz", + "integrity": "sha512-tm7C6nat+uKMr1hrapis7hS3rN9cr41tpcCKhx6cod6FLU8KwF2Yt5KUxakhIOCEcE/M/EhXhAw/qejp8w0r7Q==" + }, + "@pkgr/utils": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.3.1.tgz", + "integrity": "sha512-wfzX8kc1PMyUILA+1Z/EqoE4UCXGy0iRGMhPwdfae1+f0OXlLqCk+By+aMzgJBzR9AzS4CDizioG6Ss1gvAFJw==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "is-glob": "^4.0.3", + "open": "^8.4.0", + "picocolors": "^1.0.0", + "tiny-glob": "^0.2.9", + "tslib": "^2.4.0" + } + }, + "@redux-saga/core": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@redux-saga/core/-/core-1.2.3.tgz", + "integrity": "sha512-U1JO6ncFBAklFTwoQ3mjAeQZ6QGutsJzwNBjgVLSWDpZTRhobUzuVDS1qH3SKGJD8fvqoaYOjp6XJ3gCmeZWgA==", + "requires": { + "@babel/runtime": "^7.6.3", + "@redux-saga/deferred": "^1.2.1", + "@redux-saga/delay-p": "^1.2.1", + "@redux-saga/is": "^1.1.3", + "@redux-saga/symbols": "^1.1.3", + "@redux-saga/types": "^1.2.1", + "redux": "^4.0.4", + "typescript-tuple": "^2.2.1" + } + }, + "@redux-saga/deferred": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@redux-saga/deferred/-/deferred-1.2.1.tgz", + "integrity": "sha512-cmin3IuuzMdfQjA0lG4B+jX+9HdTgHZZ+6u3jRAOwGUxy77GSlTi4Qp2d6PM1PUoTmQUR5aijlA39scWWPF31g==" + }, + "@redux-saga/delay-p": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@redux-saga/delay-p/-/delay-p-1.2.1.tgz", + "integrity": "sha512-MdiDxZdvb1m+Y0s4/hgdcAXntpUytr9g0hpcOO1XFVyyzkrDu3SKPgBFOtHn7lhu7n24ZKIAT1qtKyQjHqRd+w==", + "requires": { + "@redux-saga/symbols": "^1.1.3" + } + }, + "@redux-saga/is": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@redux-saga/is/-/is-1.1.3.tgz", + "integrity": "sha512-naXrkETG1jLRfVfhOx/ZdLj0EyAzHYbgJWkXbB3qFliPcHKiWbv/ULQryOAEKyjrhiclmr6AMdgsXFyx7/yE6Q==", + "requires": { + "@redux-saga/symbols": "^1.1.3", + "@redux-saga/types": "^1.2.1" + } + }, + "@redux-saga/symbols": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@redux-saga/symbols/-/symbols-1.1.3.tgz", + "integrity": "sha512-hCx6ZvU4QAEUojETnX8EVg4ubNLBFl1Lps4j2tX7o45x/2qg37m3c6v+kSp8xjDJY+2tJw4QB3j8o8dsl1FDXg==" + }, + "@redux-saga/types": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@redux-saga/types/-/types-1.2.1.tgz", + "integrity": "sha512-1dgmkh+3so0+LlBWRhGA33ua4MYr7tUOj+a9Si28vUi0IUFNbff1T3sgpeDJI/LaC75bBYnQ0A3wXjn0OrRNBA==" + }, + "@rushstack/eslint-patch": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz", + "integrity": "sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==", + "dev": true + }, + "@sentry-internal/tracing": { + "version": "7.45.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.45.0.tgz", + "integrity": "sha512-0aIDY2OvUX7k2XHaimOlWkboXoQvJ9dEKvfpu0Wh0YxfUTGPa+wplUdg3WVdkk018sq1L11MKmj4MPZyYUvXhw==", + "requires": { + "@sentry/core": "7.45.0", + "@sentry/types": "7.45.0", + "@sentry/utils": "7.45.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@sentry/browser": { + "version": "7.45.0", + "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-7.45.0.tgz", + "integrity": "sha512-/dUrUwnI34voMj+jSJT7b5Jun+xy1utVyzzwTq3Oc22N+SB17ZOX9svZ4jl1Lu6tVJPVjPyvL6zlcbrbMwqFjg==", + "requires": { + "@sentry-internal/tracing": "7.45.0", + "@sentry/core": "7.45.0", + "@sentry/replay": "7.45.0", + "@sentry/types": "7.45.0", + "@sentry/utils": "7.45.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@sentry/core": { + "version": "7.45.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.45.0.tgz", + "integrity": "sha512-xJfdTS4lRmHvZI/A5MazdnKhBJFkisKu6G9EGNLlZLre+6W4PH5sb7QX4+xoBdqG7v10Jvdia112vi762ojO2w==", + "requires": { + "@sentry/types": "7.45.0", + "@sentry/utils": "7.45.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@sentry/react": { + "version": "7.45.0", + "resolved": "https://registry.npmjs.org/@sentry/react/-/react-7.45.0.tgz", + "integrity": "sha512-Dbz85nfvMUikbLHUuIt6fBNPmTvThFn+rWB5KS1NIOJifyWAdpIU3X7yCUJE5xhsUObNLiHlNJlqhaQI4nR1bQ==", + "requires": { + "@sentry/browser": "7.45.0", + "@sentry/types": "7.45.0", + "@sentry/utils": "7.45.0", + "hoist-non-react-statics": "^3.3.2", + "tslib": "^1.9.3" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@sentry/replay": { + "version": "7.45.0", + "resolved": "https://registry.npmjs.org/@sentry/replay/-/replay-7.45.0.tgz", + "integrity": "sha512-smM7FIcFIyKu30BqCl8BzLo1gH/z9WwXdGX6V0fNvHab9fJZ09+xjFn+LmIyo6N8H8jjwsup0+yQ12kiF/ZsEw==", + "requires": { + "@sentry/core": "7.45.0", + "@sentry/types": "7.45.0", + "@sentry/utils": "7.45.0" + } + }, + "@sentry/tracing": { + "version": "7.45.0", + "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-7.45.0.tgz", + "integrity": "sha512-FsoFmZPzTBGvWeJH73NxSF1ot61Zw3aIZo5XolengiKnRmcrQOFxebtMKBiZ61QBRYGqsm5uT7QB7zITU6Ikgg==", + "requires": { + "@sentry-internal/tracing": "7.45.0" + } + }, + "@sentry/types": { + "version": "7.45.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.45.0.tgz", + "integrity": "sha512-iFt7msfUK8LCodFF3RKUyaxy9tJv/gpWhzxUFyNxtuVwlpmd+q6mtsFGn8Af3pbpm8A+MKyz1ebMwXj0PQqknw==" + }, + "@sentry/utils": { + "version": "7.45.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.45.0.tgz", + "integrity": "sha512-aTY7qqtNUudd09SH5DVSKMm3iQ6ZeWufduc0I9bPZe6UMM09BDc4KmjmrzRkdQ+VaOmHo7+v+HZKQk5f+AbuTQ==", + "requires": { + "@sentry/types": "7.45.0", + "tslib": "^1.9.3" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@swc/helpers": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", + "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", + "requires": { + "tslib": "^2.4.0" + } + }, + "@types/d3-array": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.0.3.tgz", + "integrity": "sha512-Reoy+pKnvsksN0lQUlcH6dOGjRZ/3WRwXR//m+/8lt1BXeI4xyaUZoqULNjyXXRuh0Mj4LNpkCvhUpQlY3X5xQ==" + }, + "@types/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA==" + }, + "@types/d3-ease": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.0.tgz", + "integrity": "sha512-aMo4eaAOijJjA6uU+GIeW018dvy9+oH5Y2VPPzjjfxevvGQ/oRDs+tfYC9b50Q4BygRR8yE2QCLsrT0WtAVseA==" + }, + "@types/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw==", + "requires": { + "@types/d3-color": "*" + } + }, + "@types/d3-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.0.0.tgz", + "integrity": "sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg==" + }, + "@types/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-Yk4htunhPAwN0XGlIwArRomOjdoBFXC3+kCxK2Ubg7I9shQlVSJy/pG/Ht5ASN+gdMIalpk8TJ5xV74jFsetLA==", + "requires": { + "@types/d3-time": "*" + } + }, + "@types/d3-shape": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.0.tgz", + "integrity": "sha512-jYIYxFFA9vrJ8Hd4Se83YI6XF+gzDL1aC5DCsldai4XYYiVNdhtpGbA/GM6iyQ8ayhSp3a148LY34hy7A4TxZA==", + "requires": { + "@types/d3-path": "*" + } + }, + "@types/d3-time": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.0.tgz", + "integrity": "sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg==" + }, + "@types/d3-timer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.0.tgz", + "integrity": "sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g==" + }, + "@types/hoist-non-react-statics": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", + "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", + "requires": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, + "@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" + }, + "@types/react": { + "version": "18.0.23", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.23.tgz", + "integrity": "sha512-R1wTULtCiJkudAN2DJGoYYySbGtOdzZyUWAACYinKdiQC8auxso4kLDUhQ7AJ2kh3F6A6z4v69U6tNY39hihVQ==", + "requires": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "@types/react-reconciler": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.28.2.tgz", + "integrity": "sha512-8tu6lHzEgYPlfDf/J6GOQdIc+gs+S2yAqlby3zTsB3SP2svlqTYe5fwZNtZyfactP74ShooP2vvi1BOp9ZemWw==", + "requires": { + "@types/react": "*" + } + }, + "@types/scheduler": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" + }, + "@types/use-sync-external-store": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz", + "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==" + }, + "@typescript-eslint/parser": { + "version": "5.42.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.42.1.tgz", + "integrity": "sha512-kAV+NiNBWVQDY9gDJDToTE/NO8BHi4f6b7zTsVAJoTkmB/zlfOpiEVBzHOKtlgTndCKe8vj9F/PuolemZSh50Q==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.42.1", + "@typescript-eslint/types": "5.42.1", + "@typescript-eslint/typescript-estree": "5.42.1", + "debug": "^4.3.4" + } + }, + "@typescript-eslint/scope-manager": { + "version": "5.42.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.42.1.tgz", + "integrity": "sha512-QAZY/CBP1Emx4rzxurgqj3rUinfsh/6mvuKbLNMfJMMKYLRBfweus8brgXF8f64ABkIZ3zdj2/rYYtF8eiuksQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.42.1", + "@typescript-eslint/visitor-keys": "5.42.1" + } + }, + "@typescript-eslint/types": { + "version": "5.42.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.42.1.tgz", + "integrity": "sha512-Qrco9dsFF5lhalz+lLFtxs3ui1/YfC6NdXu+RAGBa8uSfn01cjO7ssCsjIsUs484vny9Xm699FSKwpkCcqwWwA==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.42.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.42.1.tgz", + "integrity": "sha512-qElc0bDOuO0B8wDhhW4mYVgi/LZL+igPwXtV87n69/kYC/7NG3MES0jHxJNCr4EP7kY1XVsRy8C/u3DYeTKQmw==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.42.1", + "@typescript-eslint/visitor-keys": "5.42.1", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.42.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.42.1.tgz", + "integrity": "sha512-LOQtSF4z+hejmpUvitPlc4hA7ERGoj2BVkesOcG91HCn8edLGUXbTrErmutmPbl8Bo9HjAvOO/zBKQHExXNA2A==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.42.1", + "eslint-visitor-keys": "^3.3.0" + } + }, + "abortcontroller-polyfill": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz", + "integrity": "sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==" + }, + "acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "optional": true, + "peer": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "aria-query": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", + "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", + "dev": true, + "requires": { + "@babel/runtime": "^7.10.2", + "@babel/runtime-corejs3": "^7.10.2" + } + }, + "array-includes": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "is-string": "^1.0.7" + } + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "array.prototype.flat": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + } + }, + "array.prototype.flatmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + } + }, + "ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==", + "dev": true + }, + "attr-accept": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-1.1.3.tgz", + "integrity": "sha512-iT40nudw8zmCweivz6j58g+RT33I4KbaIvRUhjNmDwO2WmsQUxFEZZYZ5w3vXe5x5MX9D7mfvA/XaLOZYFR9EQ==", + "requires": { + "core-js": "^2.5.0" + }, + "dependencies": { + "core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" + } + } + }, + "axe-core": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.5.0.tgz", + "integrity": "sha512-4+rr8eQ7+XXS5nZrKcMO/AikHL0hVqy+lHWAnE3xdHl+aguag8SOQ6eEqLexwLNWgXIMfunGuD3ON1/6Kyet0A==", + "dev": true + }, + "axobject-query": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", + "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==", + "dev": true + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==" + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "optional": true, + "peer": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "devOptional": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "broadcast-channel": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/broadcast-channel/-/broadcast-channel-3.7.0.tgz", + "integrity": "sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg==", + "requires": { + "@babel/runtime": "^7.7.2", + "detect-node": "^2.1.0", + "js-sha3": "0.8.0", + "microseconds": "0.2.0", + "nano-time": "1.0.0", + "oblivious-set": "1.0.0", + "rimraf": "3.0.2", + "unload": "2.2.0" + } + }, + "browser-tabs-lock": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/browser-tabs-lock/-/browser-tabs-lock-1.2.15.tgz", + "integrity": "sha512-J8K9vdivK0Di+b8SBdE7EZxDr88TnATing7XoLw6+nFkXMQ6sVBh92K3NQvZlZU91AIkFRi0w3sztk5Z+vsswA==", + "requires": { + "lodash": ">=4.17.21" + } + }, + "busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "requires": { + "streamsearch": "^1.1.0" + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001426", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001426.tgz", + "integrity": "sha512-n7cosrHLl8AWt0wwZw/PJZgUg3lV0gk9LMI7ikGJwhyhgsd2Nb65vKvmSexCqq/J7rbH3mFG6yZZiPR5dLPW5A==" + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "optional": true, + "peer": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "optional": true, + "peer": true, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" + }, + "clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==" + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "complex.js": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/complex.js/-/complex.js-2.1.1.tgz", + "integrity": "sha512-8njCHOTtFFLtegk6zQo0kkVX1rngygb/KQI6z1qZxlFI3scluC+LVTCFbrkWjBv4vvLlbQ9t88IPMC6k95VTTg==" + }, + "computed-styles": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/computed-styles/-/computed-styles-1.1.2.tgz", + "integrity": "sha512-CGbti1B791SKg6goVX0cSI++hFBSzY9+7+lhX8lqXDI5FHexluglI1cPtvIifS4mEcWxPJ+HKYPr2t6nqz7PxA==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "core-js": { + "version": "3.29.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.29.1.tgz", + "integrity": "sha512-+jwgnhg6cQxKYIIjGtAHq2nwUOolo9eoFZ4sHfUH09BLXBgxnH4gA0zEd+t+BO2cNB8idaBtZFcFTRjQJRJmAw==" + }, + "core-js-pure": { + "version": "3.26.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.26.0.tgz", + "integrity": "sha512-LiN6fylpVBVwT8twhhluD9TzXmZQQsr2I2eIKtWNbZI1XMfBT7CV18itaN6RA7EtQd/SDdRx/wzvAShX2HvhQA==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "csstype": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", + "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" + }, + "d3-array": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.0.tgz", + "integrity": "sha512-3yXFQo0oG3QCxbF06rMPFyGRMGJNS7NvsV1+2joOjbBE+9xvWQ8+GcMJAjRCzw06zQ3/arXeJgbPYcjUCuC+3g==", + "requires": { + "internmap": "1 - 2" + } + }, + "d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==" + }, + "d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==" + }, + "d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==" + }, + "d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "requires": { + "d3-color": "1 - 3" + } + }, + "d3-path": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.0.1.tgz", + "integrity": "sha512-gq6gZom9AFZby0YLduxT1qmrp4xpBA1YZr19OI717WIdKE2OM5ETq5qrHLb301IgxhLwcuxvGZVLeeWc/k1I6w==" + }, + "d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "requires": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + } + }, + "d3-shape": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.1.0.tgz", + "integrity": "sha512-tGDh1Muf8kWjEDT/LswZJ8WF85yDZLvVJpYU9Nq+8+yW1Z5enxrmXOhTArlkaElU+CTn0OTVNli+/i+HP45QEQ==", + "requires": { + "d3-path": "1 - 3" + } + }, + "d3-time": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.0.0.tgz", + "integrity": "sha512-zmV3lRnlaLI08y9IMRXSDshQb5Nj77smnfpnd2LrBa/2K281Jijactokeak14QacHs/kKq0AQ121nidNYlarbQ==", + "requires": { + "d3-array": "2 - 3" + } + }, + "d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "requires": { + "d3-time": "1 - 3" + } + }, + "d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==" + }, + "damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==" + }, + "deep-diff": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/deep-diff/-/deep-diff-0.3.8.tgz", + "integrity": "sha512-yVn6RZmHiGnxRKR9sJb3iVV2XTF1Ghh2DiWRZ3dMnGc43yUdWWF/kX6lQyk3+P84iprfWKU/8zFTrlkvtFm1ug==" + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true + }, + "define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "dev": true, + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "delaunator": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-4.0.1.tgz", + "integrity": "sha512-WNPWi1IRKZfCt/qIDMfERkDp93+iZEmOxN2yy4Jg+Xhv8SLk2UTqqbe1sfiipn0and9QrE914/ihdx82Y/Giag==" + }, + "delaunay-find": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/delaunay-find/-/delaunay-find-0.0.6.tgz", + "integrity": "sha512-1+almjfrnR7ZamBk0q3Nhg6lqSe6Le4vL0WJDSMx4IDbQwTpUTXPjxC00lqLBT8MYsJpPCbI16sIkw9cPsbi7Q==", + "requires": { + "delaunator": "^4.0.0" + } + }, + "detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "enhanced-resolve": { + "version": "5.12.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", + "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + }, + "es-abstract": { + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", + "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.3", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.2", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trimend": "^1.0.5", + "string.prototype.trimstart": "^1.0.5", + "unbox-primitive": "^1.0.2" + } + }, + "es-cookie": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/es-cookie/-/es-cookie-1.3.2.tgz", + "integrity": "sha512-UTlYYhXGLOy05P/vKVT2Ui7WtC7NiRzGtJyAKKn32g5Gvcjn7KAClLPWlipCtxIus934dFg9o9jXiBL0nP+t9Q==" + }, + "es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escape-latex": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/escape-latex/-/escape-latex-1.2.0.tgz", + "integrity": "sha512-nV5aVWW1K0wEiUIEdZ4erkGGH8mDxGyxSeqPzRNtWP7ataw+/olFObw7hujFWlVjNsaDFw5VZ5NzVSIqRgfTiw==" + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "eslint": { + "version": "8.36.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.36.0.tgz", + "integrity": "sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.1", + "@eslint/js": "8.36.0", + "@humanwhocodes/config-array": "^0.11.8", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.5.0", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + } + }, + "eslint-config-next": { + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.2.4.tgz", + "integrity": "sha512-lunIBhsoeqw6/Lfkd6zPt25w1bn0znLA/JCL+au1HoEpSb4/PpsOYsYtgV/q+YPsoKIOzFyU5xnb04iZnXjUvg==", + "dev": true, + "requires": { + "@next/eslint-plugin-next": "13.2.4", + "@rushstack/eslint-patch": "^1.1.3", + "@typescript-eslint/parser": "^5.42.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-import-resolver-typescript": "^3.5.2", + "eslint-plugin-import": "^2.26.0", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-react": "^7.31.7", + "eslint-plugin-react-hooks": "^4.5.0" + } + }, + "eslint-import-resolver-node": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", + "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", + "dev": true, + "requires": { + "debug": "^3.2.7", + "is-core-module": "^2.11.0", + "resolve": "^1.22.1" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "eslint-import-resolver-typescript": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.3.tgz", + "integrity": "sha512-njRcKYBc3isE42LaTcJNVANR3R99H9bAxBDMNDr2W7yq5gYPxbU3MkdhsQukxZ/Xg9C2vcyLlDsbKfRDg0QvCQ==", + "dev": true, + "requires": { + "debug": "^4.3.4", + "enhanced-resolve": "^5.10.0", + "get-tsconfig": "^4.2.0", + "globby": "^13.1.2", + "is-core-module": "^2.10.0", + "is-glob": "^4.0.3", + "synckit": "^0.8.4" + }, + "dependencies": { + "globby": { + "version": "13.1.3", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.3.tgz", + "integrity": "sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==", + "dev": true, + "requires": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.11", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^4.0.0" + } + }, + "slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true + } + } + }, + "eslint-module-utils": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", + "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", + "dev": true, + "requires": { + "debug": "^3.2.7" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "eslint-plugin-import": { + "version": "2.27.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", + "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", + "dev": true, + "requires": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "array.prototype.flatmap": "^1.3.1", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.7", + "eslint-module-utils": "^2.7.4", + "has": "^1.0.3", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.values": "^1.1.6", + "resolve": "^1.22.1", + "semver": "^6.3.0", + "tsconfig-paths": "^3.14.1" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "eslint-plugin-jsx-a11y": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.6.1.tgz", + "integrity": "sha512-sXgFVNHiWffBq23uiS/JaP6eVR622DqwB4yTzKvGZGcPq6/yZ3WmOZfuBks/vHWo9GaFOqC2ZK4i6+C35knx7Q==", + "dev": true, + "requires": { + "@babel/runtime": "^7.18.9", + "aria-query": "^4.2.2", + "array-includes": "^3.1.5", + "ast-types-flow": "^0.0.7", + "axe-core": "^4.4.3", + "axobject-query": "^2.2.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "has": "^1.0.3", + "jsx-ast-utils": "^3.3.2", + "language-tags": "^1.0.5", + "minimatch": "^3.1.2", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "eslint-plugin-react": { + "version": "7.31.10", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.10.tgz", + "integrity": "sha512-e4N/nc6AAlg4UKW/mXeYWd3R++qUano5/o+t+wnWxIf+bLsOaH3a4q74kX3nDjYym3VBN4HyO9nEn1GcAqgQOA==", + "dev": true, + "requires": { + "array-includes": "^3.1.5", + "array.prototype.flatmap": "^1.3.0", + "doctrine": "^2.1.0", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.5", + "object.fromentries": "^2.0.5", + "object.hasown": "^1.1.1", + "object.values": "^1.1.5", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.3", + "semver": "^6.3.0", + "string.prototype.matchall": "^4.0.7" + }, + "dependencies": { + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "resolve": { + "version": "2.0.0-next.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", + "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", + "dev": true, + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "eslint-plugin-react-hooks": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "dev": true, + "requires": {} + }, + "eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true + }, + "espree": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.0.tgz", + "integrity": "sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw==", + "dev": true, + "requires": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" + } + }, + "esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "fast-text-encoding": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.6.tgz", + "integrity": "sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==" + }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "file-saver": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-1.3.8.tgz", + "integrity": "sha512-spKHSBQIxxS81N/O21WmuXA2F6wppUCsutpzenOeZzOCCJ5gEfcbqJP983IrpLXzYmXnMUa6J03SubcNPdKrlg==" + }, + "file-selector": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-0.1.19.tgz", + "integrity": "sha512-kCWw3+Aai8Uox+5tHCNgMFaUdgidxvMnLWO6fM5sZ0hA2wlHP5/DHGF0ECe84BiB95qdJbKNEJhWKVDvMN+JDQ==", + "requires": { + "tslib": "^2.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "devOptional": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "focus-trap": { + "version": "6.9.2", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-6.9.2.tgz", + "integrity": "sha512-gBEuXOPNOKPrLdZpMFUSTyIo1eT2NSZRrwZ9r/0Jqw5tmT3Yvxfmu8KBHw8xW2XQkw6E/JoG+OlEq7UDtSUNgw==", + "requires": { + "tabbable": "^5.3.2" + } + }, + "fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==" + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "optional": true, + "peer": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + } + }, + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, + "get-tsconfig": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.4.0.tgz", + "integrity": "sha512-0Gdjo/9+FzsYhXCEFueo2aY1z1tpXrxWZzP7k8ul9qt1U5o8rYJwTJYmaeHdrVosYIVYkOy2iwCJ9FdpocJhPQ==", + "dev": true + }, + "glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + }, + "globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "globalyzer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz", + "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==", + "dev": true + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, + "globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true + }, + "graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "requires": { + "react-is": "^16.7.0" + } + }, + "ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true + }, + "immer": { + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", + "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==" + }, + "immutable": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", + "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==", + "optional": true, + "peer": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==" + }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "optional": true, + "peer": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true + }, + "is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "devOptional": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "devOptional": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "devOptional": true + }, + "is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + } + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "its-fine": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/its-fine/-/its-fine-1.0.6.tgz", + "integrity": "sha512-VZJZPwVT2kxe5KQv+TxCjojfLiUIut8zXDNLTxcM7gJ/xQ/bSPk5M0neZ+j3myy45KKkltY1mm1jyJgx3Fxsdg==", + "requires": { + "@types/react-reconciler": "^0.28.0" + } + }, + "javascript-natural-sort": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz", + "integrity": "sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==" + }, + "js-sdsl": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz", + "integrity": "sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==", + "dev": true + }, + "js-sha3": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" + }, + "json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "jsx-ast-utils": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", + "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", + "dev": true, + "requires": { + "array-includes": "^3.1.5", + "object.assign": "^4.1.3" + } + }, + "konva": { + "version": "8.4.3", + "resolved": "https://registry.npmjs.org/konva/-/konva-8.4.3.tgz", + "integrity": "sha512-ARqdgAbdNIougRlOKvkQwHlGhXPRBV4KvhCP+qoPpGoVQwwiJe4Hkdu4HHdRPb9rGUp04jDTAxBzEwBsE272pg==" + }, + "language-subtag-registry": { + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", + "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==", + "dev": true + }, + "language-tags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", + "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", + "dev": true, + "requires": { + "language-subtag-registry": "~0.3.2" + } + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "match-sorter": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/match-sorter/-/match-sorter-6.3.1.tgz", + "integrity": "sha512-mxybbo3pPNuA+ZuCUhm5bwNkXrJTbsk5VWbR5wiwz/GC6LIiegBGn2w3O08UG/jdbYLinw51fSQ5xNU1U3MgBw==", + "requires": { + "@babel/runtime": "^7.12.5", + "remove-accents": "0.4.2" + } + }, + "mathjs": { + "version": "11.7.0", + "resolved": "https://registry.npmjs.org/mathjs/-/mathjs-11.7.0.tgz", + "integrity": "sha512-RCXtrP5xGIbl9PUc5+7QL81rBCUjzoIZ0ugNqKsarOUxg+x7deY0BzfNai+bGfUL/T+1uYq1xs5w2xVdL3lp0g==", + "requires": { + "@babel/runtime": "^7.21.0", + "complex.js": "^2.1.1", + "decimal.js": "^10.4.3", + "escape-latex": "^1.2.0", + "fraction.js": "^4.2.0", + "javascript-natural-sort": "^0.7.1", + "seedrandom": "^3.0.5", + "tiny-emitter": "^2.1.0", + "typed-function": "^4.1.0" + } + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "microseconds": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/microseconds/-/microseconds-0.2.0.tgz", + "integrity": "sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA==" + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "nano-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/nano-time/-/nano-time-1.0.0.tgz", + "integrity": "sha512-flnngywOoQ0lLQOTRNexn2gGSNuM9bKj9RZAWSzhQ+UJYaAFG9bac4DW9VHjUAzrOaIcajHybCTHe/bkvozQqA==", + "requires": { + "big-integer": "^1.6.16" + } + }, + "nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==" + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "next": { + "version": "13.5.4", + "resolved": "https://registry.npmjs.org/next/-/next-13.5.4.tgz", + "integrity": "sha512-+93un5S779gho8y9ASQhb/bTkQF17FNQOtXLKAj3lsNgltEcF0C5PMLLncDmH+8X1EnJH1kbqAERa29nRXqhjA==", + "requires": { + "@next/env": "13.5.4", + "@next/swc-darwin-arm64": "13.5.4", + "@next/swc-darwin-x64": "13.5.4", + "@next/swc-linux-arm64-gnu": "13.5.4", + "@next/swc-linux-arm64-musl": "13.5.4", + "@next/swc-linux-x64-gnu": "13.5.4", + "@next/swc-linux-x64-musl": "13.5.4", + "@next/swc-win32-arm64-msvc": "13.5.4", + "@next/swc-win32-ia32-msvc": "13.5.4", + "@next/swc-win32-x64-msvc": "13.5.4", + "@swc/helpers": "0.5.2", + "busboy": "1.6.0", + "caniuse-lite": "^1.0.30001406", + "postcss": "8.4.31", + "styled-jsx": "5.1.1", + "watchpack": "2.4.0" + } + }, + "next-global-css": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/next-global-css/-/next-global-css-1.3.1.tgz", + "integrity": "sha512-+OnTwQKmv1lDP7r4R3T94oq6372R9UGVivchBQu49j7ZjzvSXHCnv93yAuhgMkvUgAbGifTs8sQ5YL9wjyAxfA==" + }, + "next-runtime-env": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/next-runtime-env/-/next-runtime-env-1.7.1.tgz", + "integrity": "sha512-KIWciYVcYBoc0dBTyx7tEogyESacAJCkseU9+AcIYbkq3MiV6WyhHHPfDONpXbJSlpT3u3utrSrngua2EFlfyA==", + "requires": { + "chalk": "^4.1.2" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "optional": true, + "peer": true + }, + "normalizr": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/normalizr/-/normalizr-3.6.2.tgz", + "integrity": "sha512-30qCybsBaCBciotorvuOZTCGEg2AXrJfADMT2Kk/lvpIAcipHdK0zc33nNtwKzyfQAqIJXAcqET6YgflYUgsoQ==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + }, + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, + "object.entries": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", + "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, + "object.fromentries": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz", + "integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, + "object.hasown": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.1.tgz", + "integrity": "sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A==", + "dev": true, + "requires": { + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + } + }, + "object.values": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "oblivious-set": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/oblivious-set/-/oblivious-set-1.0.0.tgz", + "integrity": "sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "requires": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "devOptional": true + }, + "popper.js": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", + "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==" + }, + "postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "requires": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "prettier": { + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz", + "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==" + }, + "promise-polyfill": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-8.3.0.tgz", + "integrity": "sha512-H5oELycFml5yto/atYqmjyigJoAo3+OXwolYiH7OfQuYlAqhxNvTfiNMbV9hsC6Yp83yE5r2KTVmtrG6R9i6Pg==" + }, + "prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "prop-types-extra": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.1.tgz", + "integrity": "sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew==", + "requires": { + "react-is": "^16.3.2", + "warning": "^4.0.0" + } + }, + "punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "requires": { + "loose-envify": "^1.1.0" + } + }, + "react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "requires": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + } + }, + "react-dropzone": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-9.0.0.tgz", + "integrity": "sha512-wZ2o9B2qkdE3RumWhfyZT9swgJYJPeU5qHEcMU8weYpmLex1eeWX0CC32/Y0VutB+BBi2D+iePV/YZIiB4kZGw==", + "requires": { + "attr-accept": "^1.1.3", + "file-selector": "^0.1.8", + "prop-types": "^15.6.2", + "prop-types-extra": "^1.1.0" + } + }, + "react-fast-compare": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz", + "integrity": "sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==" + }, + "react-hotkeys-hook": { + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/react-hotkeys-hook/-/react-hotkeys-hook-4.3.8.tgz", + "integrity": "sha512-RmrIQ3M259c84MnYVEAQsmHkD6s7XUgLG0rW6S7qjt1Lh7q+SPIz5b6obVU8OJw1Utsj1mUCj6twtBPaK/ytww==", + "requires": {} + }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "react-konva": { + "version": "18.2.5", + "resolved": "https://registry.npmjs.org/react-konva/-/react-konva-18.2.5.tgz", + "integrity": "sha512-lTqJStcHnpGSXB9RlV7p5at3MpRML/TujzbuUDZRIInsLocJ/I4Nhhg3w6yJm9UV05kcwr88OY6LO+2zRyzXog==", + "requires": { + "@types/react-reconciler": "^0.28.2", + "its-fine": "^1.0.6", + "react-reconciler": "~0.29.0", + "scheduler": "^0.23.0" + } + }, + "react-query": { + "version": "3.39.3", + "resolved": "https://registry.npmjs.org/react-query/-/react-query-3.39.3.tgz", + "integrity": "sha512-nLfLz7GiohKTJDuT4us4X3h/8unOh+00MLb2yJoGTPjxKs2bc1iDhkNx2bd5MKklXnOD3NrVZ+J2UXujA5In4g==", + "requires": { + "@babel/runtime": "^7.5.5", + "broadcast-channel": "^3.4.1", + "match-sorter": "^6.0.2" + } + }, + "react-reconciler": { + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.29.0.tgz", + "integrity": "sha512-wa0fGj7Zht1EYMRhKWwoo1H9GApxYLBuhoAuXN0TlltESAjDssB+Apf0T/DngVqaMyPypDmabL37vw/2aRM98Q==", + "requires": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + } + }, + "react-redux": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-8.0.5.tgz", + "integrity": "sha512-Q2f6fCKxPFpkXt1qNRZdEDLlScsDWyrgSj0mliK59qU6W5gvBiKkdMEG2lJzhd1rCctf0hb6EtePPLZ2e0m1uw==", + "requires": { + "@babel/runtime": "^7.12.1", + "@types/hoist-non-react-statics": "^3.3.1", + "@types/use-sync-external-store": "^0.0.3", + "hoist-non-react-statics": "^3.3.2", + "react-is": "^18.0.0", + "use-sync-external-store": "^1.0.0" + }, + "dependencies": { + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + } + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "optional": true, + "peer": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "redux": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", + "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", + "requires": { + "@babel/runtime": "^7.9.2" + } + }, + "redux-logger": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/redux-logger/-/redux-logger-3.0.6.tgz", + "integrity": "sha512-JoCIok7bg/XpqA1JqCqXFypuqBbQzGQySrhFzewB7ThcnysTO30l4VCst86AuB9T9tuT03MAA56Jw2PNhRSNCg==", + "requires": { + "deep-diff": "^0.3.5" + } + }, + "redux-saga": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/redux-saga/-/redux-saga-1.2.3.tgz", + "integrity": "sha512-HDe0wTR5nhd8Xr5xjGzoyTbdAw6rjy1GDplFt3JKtKN8/MnkQSRqK/n6aQQhpw5NI4ekDVOaW+w4sdxPBaCoTQ==", + "requires": { + "@redux-saga/core": "^1.2.3" + } + }, + "redux-thunk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz", + "integrity": "sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==", + "requires": {} + }, + "regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, + "regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + } + }, + "remove-accents": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.4.2.tgz", + "integrity": "sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA==" + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + } + }, + "sass": { + "version": "1.55.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.55.0.tgz", + "integrity": "sha512-Pk+PMy7OGLs9WaxZGJMn7S96dvlyVBwwtToX895WmCpAOr5YiJYEUJfiJidMuKb613z2xNWcXCHEuOvjZbqC6A==", + "optional": true, + "peer": true, + "requires": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + } + }, + "scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "requires": { + "loose-envify": "^1.1.0" + } + }, + "seedrandom": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", + "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==" + }, + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" + }, + "streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==" + }, + "string.prototype.matchall": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz", + "integrity": "sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1", + "get-intrinsic": "^1.1.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.4.1", + "side-channel": "^1.0.4" + } + }, + "string.prototype.trimend": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", + "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + } + }, + "string.prototype.trimstart": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", + "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "styled-jsx": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", + "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", + "requires": { + "client-only": "0.0.1" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "svgsaver": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/svgsaver/-/svgsaver-0.9.0.tgz", + "integrity": "sha512-m94bg62CjuKyhcyJV50ljIPDo5FxEwmdOn60IvHEPlGKhC8gNMnyxbjlYmGi9QW9rIi93DjvfjBuafFfn3+m0w==", + "requires": { + "computed-styles": "^1.1.2", + "file-saver": "^1.3.3" + } + }, + "synckit": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz", + "integrity": "sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==", + "dev": true, + "requires": { + "@pkgr/utils": "^2.3.1", + "tslib": "^2.5.0" + } + }, + "tabbable": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-5.3.3.tgz", + "integrity": "sha512-QD9qKY3StfbZqWOPLp0++pOrAVb/HbUi5xCc8cUo4XjP19808oaMiDzn0leBY5mCespIBM0CIZePzZjgzR83kA==" + }, + "tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "tiny-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", + "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==" + }, + "tiny-glob": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", + "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==", + "dev": true, + "requires": { + "globalyzer": "0.1.0", + "globrex": "^0.1.2" + } + }, + "tippy.js": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/tippy.js/-/tippy.js-5.1.2.tgz", + "integrity": "sha512-Qtrv2wqbRbaKMUb6bWWBQWPayvcDKNrGlvihxtsyowhT7RLGEh1STWuy6EMXC6QLkfKPB2MLnf8W2mzql9VDAw==", + "requires": { + "popper.js": "^1.16.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "devOptional": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "tsconfig-paths": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "dev": true, + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + }, + "typed-function": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/typed-function/-/typed-function-4.1.0.tgz", + "integrity": "sha512-DGwUl6cioBW5gw2L+6SMupGwH/kZOqivy17E4nsh1JI9fKF87orMmlQx3KISQPmg3sfnOUGlwVkroosvgddrlg==" + }, + "typescript": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", + "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", + "dev": true, + "peer": true + }, + "typescript-compare": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/typescript-compare/-/typescript-compare-0.0.2.tgz", + "integrity": "sha512-8ja4j7pMHkfLJQO2/8tut7ub+J3Lw2S3061eJLFQcvs3tsmJKp8KG5NtpLn7KcY2w08edF74BSVN7qJS0U6oHA==", + "requires": { + "typescript-logic": "^0.0.0" + } + }, + "typescript-logic": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/typescript-logic/-/typescript-logic-0.0.0.tgz", + "integrity": "sha512-zXFars5LUkI3zP492ls0VskH3TtdeHCqu0i7/duGt60i5IGPIpAHE/DWo5FqJ6EjQ15YKXrt+AETjv60Dat34Q==" + }, + "typescript-tuple": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/typescript-tuple/-/typescript-tuple-2.2.1.tgz", + "integrity": "sha512-Zcr0lbt8z5ZdEzERHAMAniTiIKerFCMgd7yjq1fPnDJ43et/k9twIFQMUYff9k5oXcsQ0WpvFcgzK2ZKASoW6Q==", + "requires": { + "typescript-compare": "^0.0.2" + } + }, + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + }, + "unfetch": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/unfetch/-/unfetch-4.2.0.tgz", + "integrity": "sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==" + }, + "unload": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unload/-/unload-2.2.0.tgz", + "integrity": "sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA==", + "requires": { + "@babel/runtime": "^7.6.2", + "detect-node": "^2.0.4" + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "use-resize-observer": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/use-resize-observer/-/use-resize-observer-9.1.0.tgz", + "integrity": "sha512-R25VqO9Wb3asSD4eqtcxk8sJalvIOYBqS8MNZlpDSQ4l4xMQxC/J7Id9HoTqPq8FwULIn0PVW+OAqF2dyYbjow==", + "requires": { + "@juggle/resize-observer": "^3.3.1" + } + }, + "use-sync-external-store": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "requires": {} + }, + "uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==" + }, + "victory-area": { + "version": "36.6.8", + "resolved": "https://registry.npmjs.org/victory-area/-/victory-area-36.6.8.tgz", + "integrity": "sha512-aIyMuzUqiDcpTCB7FUOYDJvqiDPiluEXLOw6Lh1vrUYmV7CNqMDOIBtTau2vI41Ao0o0YJdCAcyzBib9e3UYbw==", + "requires": { + "lodash": "^4.17.19", + "prop-types": "^15.8.1", + "victory-core": "^36.6.8", + "victory-vendor": "^36.6.8" + } + }, + "victory-axis": { + "version": "36.6.8", + "resolved": "https://registry.npmjs.org/victory-axis/-/victory-axis-36.6.8.tgz", + "integrity": "sha512-tClVJEay1YOJAh9rRyyLx8pei7Sr1/xTz04bJmfzFoAxFoPBtvgfFwXhfZ1YjGIl7m5Wh2CiYMY3figueLzYtg==", + "requires": { + "lodash": "^4.17.19", + "prop-types": "^15.8.1", + "victory-core": "^36.6.8" + } + }, + "victory-bar": { + "version": "36.6.8", + "resolved": "https://registry.npmjs.org/victory-bar/-/victory-bar-36.6.8.tgz", + "integrity": "sha512-jLLPm3IW8/2uSLPvQD9bxzXnTraUYBIDTkbZPZy7oHP01OVzP1sj+MMHcINCWcUbyUyLZDL3u8CvViXjS273JQ==", + "requires": { + "lodash": "^4.17.19", + "prop-types": "^15.8.1", + "victory-core": "^36.6.8", + "victory-vendor": "^36.6.8" + } + }, + "victory-brush-container": { + "version": "36.6.8", + "resolved": "https://registry.npmjs.org/victory-brush-container/-/victory-brush-container-36.6.8.tgz", + "integrity": "sha512-PN5zQ6kjVwZca1qV41WlV6J2IEyQh+2hykRe6c/wERDotVVbSrX3sJVAzUbN+7x2rrK0CL6a/XUI8jDsWTMM2A==", + "requires": { + "lodash": "^4.17.19", + "prop-types": "^15.8.1", + "react-fast-compare": "^3.2.0", + "victory-core": "^36.6.8" + } + }, + "victory-chart": { + "version": "36.6.8", + "resolved": "https://registry.npmjs.org/victory-chart/-/victory-chart-36.6.8.tgz", + "integrity": "sha512-kC1jL63PAmqUrvZNOfwAXNuaIwz4nvXYUuEPu59WRBCOIGDGRgv2wJ1O7O0xYXqDkI57EtAYf9KUK+miEn/Btg==", + "requires": { + "lodash": "^4.17.19", + "prop-types": "^15.8.1", + "react-fast-compare": "^3.2.0", + "victory-axis": "^36.6.8", + "victory-core": "^36.6.8", + "victory-polar-axis": "^36.6.8", + "victory-shared-events": "^36.6.8" + } + }, + "victory-core": { + "version": "36.6.8", + "resolved": "https://registry.npmjs.org/victory-core/-/victory-core-36.6.8.tgz", + "integrity": "sha512-SkyEszZKGyxjqfptfFWYdI22CvCuE9LhkaDpikzIhT2gcE3SuOBO5fk/740XMYE2ZUsJ4Fu/Vy4+8jZi17y44A==", + "requires": { + "lodash": "^4.17.21", + "prop-types": "^15.8.1", + "react-fast-compare": "^3.2.0", + "victory-vendor": "^36.6.8" + } + }, + "victory-create-container": { + "version": "36.6.8", + "resolved": "https://registry.npmjs.org/victory-create-container/-/victory-create-container-36.6.8.tgz", + "integrity": "sha512-H2BsdTbJ/RxxcEg5lzk3TDlihtOs7I/5KaIBP3yosPs702i40mL2qndkRkj08QeiZhkaKfQ2GOUvyP+t7DSdmg==", + "requires": { + "lodash": "^4.17.19", + "victory-brush-container": "^36.6.8", + "victory-core": "^36.6.8", + "victory-cursor-container": "^36.6.8", + "victory-selection-container": "^36.6.8", + "victory-voronoi-container": "^36.6.8", + "victory-zoom-container": "^36.6.8" + } + }, + "victory-cursor-container": { + "version": "36.6.8", + "resolved": "https://registry.npmjs.org/victory-cursor-container/-/victory-cursor-container-36.6.8.tgz", + "integrity": "sha512-3WIBRl+7jnZok6syLfW8RK23nliDcoD/JUTN0YZo6bKBqHeFc4+ur3mlwCfghH7sGoxJRYuOJxTd9x2MwM5HQQ==", + "requires": { + "lodash": "^4.17.19", + "prop-types": "^15.8.1", + "victory-core": "^36.6.8" + } + }, + "victory-errorbar": { + "version": "36.6.8", + "resolved": "https://registry.npmjs.org/victory-errorbar/-/victory-errorbar-36.6.8.tgz", + "integrity": "sha512-N4JdBy5wV+KU6pus7FBx+5on31oXanO+qVmtRH8u4W7CMWH5EwHortyu2wVYD9K2QoluXemIxZd7kfn14hmqfQ==", + "requires": { + "lodash": "^4.17.19", + "prop-types": "^15.8.1", + "victory-core": "^36.6.8" + } + }, + "victory-group": { + "version": "36.6.8", + "resolved": "https://registry.npmjs.org/victory-group/-/victory-group-36.6.8.tgz", + "integrity": "sha512-CiupDIGPPWVgwif3ayd8glSlR41mVbuT0Nl0ay9q42w2fiM32syiJAoifIw47X4tL8ow/DXH+/5Pd8eEyA2trA==", + "requires": { + "lodash": "^4.17.19", + "prop-types": "^15.8.1", + "react-fast-compare": "^3.2.0", + "victory-core": "^36.6.8", + "victory-shared-events": "^36.6.8" + } + }, + "victory-legend": { + "version": "36.6.8", + "resolved": "https://registry.npmjs.org/victory-legend/-/victory-legend-36.6.8.tgz", + "integrity": "sha512-OnkzB82Mvt5/1LYNsrfZQoXaVvgfp1rCsFRI3imq257Sh/UPy0/eZehCMQs/SVbU0z0EuIpXokhZb3BBdoJgpw==", + "requires": { + "lodash": "^4.17.19", + "prop-types": "^15.8.1", + "victory-core": "^36.6.8" + } + }, + "victory-line": { + "version": "36.6.8", + "resolved": "https://registry.npmjs.org/victory-line/-/victory-line-36.6.8.tgz", + "integrity": "sha512-MozOejQRZPdzFaru5zUfqVB4TEff6nZjtQhOs+F5yyhXjLgM89zGX30r3jK5cjVdAPbTu4KPUrwktvlw+AkPRA==", + "requires": { + "lodash": "^4.17.19", + "prop-types": "^15.8.1", + "victory-core": "^36.6.8", + "victory-vendor": "^36.6.8" + } + }, + "victory-pie": { + "version": "36.6.8", + "resolved": "https://registry.npmjs.org/victory-pie/-/victory-pie-36.6.8.tgz", + "integrity": "sha512-dUHWiiKd60dlt7OjFa+YYwanHAkP/T0abzy6O3SFxGre52oeqd8px1EoVhlLKpn4ao8L35koG9mvz6/pGyr8Dw==", + "requires": { + "lodash": "^4.17.19", + "prop-types": "^15.8.1", + "victory-core": "^36.6.8", + "victory-vendor": "^36.6.8" + } + }, + "victory-polar-axis": { + "version": "36.6.8", + "resolved": "https://registry.npmjs.org/victory-polar-axis/-/victory-polar-axis-36.6.8.tgz", + "integrity": "sha512-aU+Wp5six21POhI9oXeREnZHljpqcmwFHHnliVGrwgRsuc7TAjfXPWVOX9guEFfh6zQW6IZWWWTTLAN/PIEm9w==", + "requires": { + "lodash": "^4.17.19", + "prop-types": "^15.8.1", + "victory-core": "^36.6.8" + } + }, + "victory-scatter": { + "version": "36.6.8", + "resolved": "https://registry.npmjs.org/victory-scatter/-/victory-scatter-36.6.8.tgz", + "integrity": "sha512-GKSNneBxIWLsF3eBSTW5IwT5S4YdsfFl4PVCP3/wTa2myfS5DIS9FufEnJp/FEZGalEXYWxeR47rlWqABxAj5A==", + "requires": { + "lodash": "^4.17.19", + "prop-types": "^15.8.1", + "victory-core": "^36.6.8" + } + }, + "victory-selection-container": { + "version": "36.6.8", + "resolved": "https://registry.npmjs.org/victory-selection-container/-/victory-selection-container-36.6.8.tgz", + "integrity": "sha512-kudYbSX+o7fr64oeN7+EG/c+lqO22aypxVdCwa6BagAGoqqLR4jXxTqqIdp8tvxCgfCCXxopnTKYr46nubypGw==", + "requires": { + "lodash": "^4.17.19", + "prop-types": "^15.8.1", + "victory-core": "^36.6.8" + } + }, + "victory-shared-events": { + "version": "36.6.8", + "resolved": "https://registry.npmjs.org/victory-shared-events/-/victory-shared-events-36.6.8.tgz", + "integrity": "sha512-hWPOVqMD3Sv6Rl1iyO6ibQrwYF9/eLCnRo0T59/Hsid6On0AJJjL9gv0oEIM5fqz7R7zx9PJmMk877IctEOemw==", + "requires": { + "json-stringify-safe": "^5.0.1", + "lodash": "^4.17.19", + "prop-types": "^15.8.1", + "react-fast-compare": "^3.2.0", + "victory-core": "^36.6.8" + } + }, + "victory-stack": { + "version": "36.6.8", + "resolved": "https://registry.npmjs.org/victory-stack/-/victory-stack-36.6.8.tgz", + "integrity": "sha512-Pkux46IqAealOi0KvqQpaJKKKpHCfZ/sh5IeUKYFy+QKWAjiQjG6hFZeHgr2YaS7OfdbvHhoAdvp03KntWzpbw==", + "requires": { + "lodash": "^4.17.19", + "prop-types": "^15.8.1", + "react-fast-compare": "^3.2.0", + "victory-core": "^36.6.8", + "victory-shared-events": "^36.6.8" + } + }, + "victory-tooltip": { + "version": "36.6.8", + "resolved": "https://registry.npmjs.org/victory-tooltip/-/victory-tooltip-36.6.8.tgz", + "integrity": "sha512-9P+QeAGyDpP0trJnQ1NtnbDhpoJB0Ghc2boYEehvL12p0OzolY9/Nq5SDP0tu5i1BBujwFXtnoCDqt+mOH25fA==", + "requires": { + "lodash": "^4.17.19", + "prop-types": "^15.8.1", + "victory-core": "^36.6.8" + } + }, + "victory-vendor": { + "version": "36.6.8", + "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.6.8.tgz", + "integrity": "sha512-H3kyQ+2zgjMPvbPqAl7Vwm2FD5dU7/4bCTQakFQnpIsfDljeOMDojRsrmJfwh4oAlNnWhpAf+mbAoLh8u7dwyQ==", + "requires": { + "@types/d3-array": "^3.0.3", + "@types/d3-ease": "^3.0.0", + "@types/d3-interpolate": "^3.0.1", + "@types/d3-scale": "^4.0.2", + "@types/d3-shape": "^3.1.0", + "@types/d3-time": "^3.0.0", + "@types/d3-timer": "^3.0.0", + "d3-array": "^3.1.6", + "d3-ease": "^3.0.1", + "d3-interpolate": "^3.0.1", + "d3-scale": "^4.0.2", + "d3-shape": "^3.1.0", + "d3-time": "^3.0.0", + "d3-timer": "^3.0.1" + } + }, + "victory-voronoi-container": { + "version": "36.6.8", + "resolved": "https://registry.npmjs.org/victory-voronoi-container/-/victory-voronoi-container-36.6.8.tgz", + "integrity": "sha512-x9/OOZdMm4dh38jNhSfBYT0nG6ribsINU0/WNzIn3QcDXFBInsJ7jRySxYmdmk45OdXfbDRwDMqVHk72sWQyUw==", + "requires": { + "delaunay-find": "0.0.6", + "lodash": "^4.17.19", + "prop-types": "^15.8.1", + "react-fast-compare": "^3.2.0", + "victory-core": "^36.6.8", + "victory-tooltip": "^36.6.8" + } + }, + "victory-zoom-container": { + "version": "36.6.8", + "resolved": "https://registry.npmjs.org/victory-zoom-container/-/victory-zoom-container-36.6.8.tgz", + "integrity": "sha512-gxX5iJUaxrFFZ2IGS0sQnUI+3Mhj6bVLqtOlQd3Krld+9f/ieuUbxl+P+eIyhQU/VyHSlirIZeOGOXJeYcU9jQ==", + "requires": { + "lodash": "^4.17.19", + "prop-types": "^15.8.1", + "victory-core": "^36.6.8" + } + }, + "warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "word-wrap": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", + "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + } } } diff --git a/opendc-web/opendc-web-ui/package.json b/opendc-web/opendc-web-server/src/main/webui/package.json index 18840db6..8e5bda2a 100644 --- a/opendc-web/opendc-web-ui/package.json +++ b/opendc-web/opendc-web-server/src/main/webui/package.json @@ -39,6 +39,7 @@ "react-konva": "^18.2.5", "react-query": "^3.39.3", "react-redux": "^8.0.5", + "next-runtime-env": "^1.7.1", "redux": "^4.2.1", "redux-logger": "^3.0.6", "redux-saga": "^1.2.3", @@ -57,7 +58,7 @@ "precommit": "lint-staged", "dev": "next dev", "lint": "next lint", - "build": "next build", + "build": "next build && next export", "start": "next start", "export": "next export -o build/export" }, diff --git a/opendc-web/opendc-web-ui/src/pages/404.js b/opendc-web/opendc-web-server/src/main/webui/pages/404.js index 0939bc56..0939bc56 100644 --- a/opendc-web/opendc-web-ui/src/pages/404.js +++ b/opendc-web/opendc-web-server/src/main/webui/pages/404.js diff --git a/opendc-web/opendc-web-ui/src/pages/_app.js b/opendc-web/opendc-web-server/src/main/webui/pages/_app.js index 62ce0539..62ce0539 100644 --- a/opendc-web/opendc-web-ui/src/pages/_app.js +++ b/opendc-web/opendc-web-server/src/main/webui/pages/_app.js diff --git a/opendc-web/opendc-web-ui/src/pages/_document.js b/opendc-web/opendc-web-server/src/main/webui/pages/_document.js index 9f84b2ab..0a01a3eb 100644 --- a/opendc-web/opendc-web-ui/src/pages/_document.js +++ b/opendc-web/opendc-web-server/src/main/webui/pages/_document.js @@ -63,6 +63,8 @@ class OpenDCDocument extends Document { content="OpenDC provides collaborative online datacenter modeling, diverse and effective datacenter simulation, and exploratory datacenter performance feedback." /> <meta property="og:locale" content="en_US" /> + {/* Load config before Next scripts */} + <script src="/__ENV.js" /> </Head> <body> <Main /> diff --git a/opendc-web/opendc-web-ui/src/pages/logout.js b/opendc-web/opendc-web-server/src/main/webui/pages/logout.js index 38d5968e..38d5968e 100644 --- a/opendc-web/opendc-web-ui/src/pages/logout.js +++ b/opendc-web/opendc-web-server/src/main/webui/pages/logout.js diff --git a/opendc-web/opendc-web-ui/src/pages/projects/[project]/index.js b/opendc-web/opendc-web-server/src/main/webui/pages/projects/[project]/index.js index 52938bcd..52938bcd 100644 --- a/opendc-web/opendc-web-ui/src/pages/projects/[project]/index.js +++ b/opendc-web/opendc-web-server/src/main/webui/pages/projects/[project]/index.js diff --git a/opendc-web/opendc-web-ui/src/pages/projects/[project]/portfolios/[portfolio].js b/opendc-web/opendc-web-server/src/main/webui/pages/projects/[project]/portfolios/[portfolio].js index 5d1e041b..5d1e041b 100644 --- a/opendc-web/opendc-web-ui/src/pages/projects/[project]/portfolios/[portfolio].js +++ b/opendc-web/opendc-web-server/src/main/webui/pages/projects/[project]/portfolios/[portfolio].js diff --git a/opendc-web/opendc-web-ui/src/pages/projects/[project]/topologies/[topology].js b/opendc-web/opendc-web-server/src/main/webui/pages/projects/[project]/topologies/[topology].js index 48359365..48359365 100644 --- a/opendc-web/opendc-web-ui/src/pages/projects/[project]/topologies/[topology].js +++ b/opendc-web/opendc-web-server/src/main/webui/pages/projects/[project]/topologies/[topology].js diff --git a/opendc-web/opendc-web-ui/src/pages/projects/index.js b/opendc-web/opendc-web-server/src/main/webui/pages/projects/index.js index 97ff105c..97ff105c 100644 --- a/opendc-web/opendc-web-ui/src/pages/projects/index.js +++ b/opendc-web/opendc-web-server/src/main/webui/pages/projects/index.js diff --git a/opendc-web/opendc-web-ui/public/favicon.ico b/opendc-web/opendc-web-server/src/main/webui/public/favicon.ico Binary files differindex c2f40a0d..c2f40a0d 100644 --- a/opendc-web/opendc-web-ui/public/favicon.ico +++ b/opendc-web/opendc-web-server/src/main/webui/public/favicon.ico diff --git a/opendc-web/opendc-web-ui/public/humans.txt b/opendc-web/opendc-web-server/src/main/webui/public/humans.txt index dadcd530..dadcd530 100644 --- a/opendc-web/opendc-web-ui/public/humans.txt +++ b/opendc-web/opendc-web-server/src/main/webui/public/humans.txt diff --git a/opendc-web/opendc-web-ui/public/img/avatar.svg b/opendc-web/opendc-web-server/src/main/webui/public/img/avatar.svg index 73726f9b..73726f9b 100644 --- a/opendc-web/opendc-web-ui/public/img/avatar.svg +++ b/opendc-web/opendc-web-server/src/main/webui/public/img/avatar.svg diff --git a/opendc-web/opendc-web-ui/public/img/datacenter-drawing.png b/opendc-web/opendc-web-server/src/main/webui/public/img/datacenter-drawing.png Binary files differindex ec2b7398..ec2b7398 100644 --- a/opendc-web/opendc-web-ui/public/img/datacenter-drawing.png +++ b/opendc-web/opendc-web-server/src/main/webui/public/img/datacenter-drawing.png diff --git a/opendc-web/opendc-web-ui/public/img/logo.png b/opendc-web/opendc-web-server/src/main/webui/public/img/logo.png Binary files differindex d743038b..d743038b 100644 --- a/opendc-web/opendc-web-ui/public/img/logo.png +++ b/opendc-web/opendc-web-server/src/main/webui/public/img/logo.png diff --git a/opendc-web/opendc-web-ui/public/img/logo.svg b/opendc-web/opendc-web-server/src/main/webui/public/img/logo.svg index 5283a034..5283a034 100644 --- a/opendc-web/opendc-web-ui/public/img/logo.svg +++ b/opendc-web/opendc-web-server/src/main/webui/public/img/logo.svg diff --git a/opendc-web/opendc-web-ui/public/img/opendc-architecture.png b/opendc-web/opendc-web-server/src/main/webui/public/img/opendc-architecture.png Binary files differindex e0bf8e9b..e0bf8e9b 100644 --- a/opendc-web/opendc-web-ui/public/img/opendc-architecture.png +++ b/opendc-web/opendc-web-server/src/main/webui/public/img/opendc-architecture.png diff --git a/opendc-web/opendc-web-ui/public/img/opendc-timeline-v2.png b/opendc-web/opendc-web-server/src/main/webui/public/img/opendc-timeline-v2.png Binary files differindex 0b2821c4..0b2821c4 100644 --- a/opendc-web/opendc-web-ui/public/img/opendc-timeline-v2.png +++ b/opendc-web/opendc-web-server/src/main/webui/public/img/opendc-timeline-v2.png diff --git a/opendc-web/opendc-web-ui/public/img/portraits/aiosup.png b/opendc-web/opendc-web-server/src/main/webui/public/img/portraits/aiosup.png Binary files differindex d2019b4d..d2019b4d 100644 --- a/opendc-web/opendc-web-ui/public/img/portraits/aiosup.png +++ b/opendc-web/opendc-web-server/src/main/webui/public/img/portraits/aiosup.png diff --git a/opendc-web/opendc-web-ui/public/img/portraits/evaneyk.png b/opendc-web/opendc-web-server/src/main/webui/public/img/portraits/evaneyk.png Binary files differindex 011c1627..011c1627 100644 --- a/opendc-web/opendc-web-ui/public/img/portraits/evaneyk.png +++ b/opendc-web/opendc-web-server/src/main/webui/public/img/portraits/evaneyk.png diff --git a/opendc-web/opendc-web-ui/public/img/portraits/fmastenbroek.png b/opendc-web/opendc-web-server/src/main/webui/public/img/portraits/fmastenbroek.png Binary files differindex 218b1a6f..218b1a6f 100644 --- a/opendc-web/opendc-web-ui/public/img/portraits/fmastenbroek.png +++ b/opendc-web/opendc-web-server/src/main/webui/public/img/portraits/fmastenbroek.png diff --git a/opendc-web/opendc-web-ui/public/img/portraits/gandreadis.png b/opendc-web/opendc-web-server/src/main/webui/public/img/portraits/gandreadis.png Binary files differindex 96a3abda..96a3abda 100644 --- a/opendc-web/opendc-web-ui/public/img/portraits/gandreadis.png +++ b/opendc-web/opendc-web-server/src/main/webui/public/img/portraits/gandreadis.png diff --git a/opendc-web/opendc-web-ui/public/img/portraits/hhe.png b/opendc-web/opendc-web-server/src/main/webui/public/img/portraits/hhe.png Binary files differindex 4891c7f5..4891c7f5 100644 --- a/opendc-web/opendc-web-ui/public/img/portraits/hhe.png +++ b/opendc-web/opendc-web-server/src/main/webui/public/img/portraits/hhe.png diff --git a/opendc-web/opendc-web-ui/public/img/portraits/jbosch.png b/opendc-web/opendc-web-server/src/main/webui/public/img/portraits/jbosch.png Binary files differindex c76e1fab..c76e1fab 100644 --- a/opendc-web/opendc-web-ui/public/img/portraits/jbosch.png +++ b/opendc-web/opendc-web-server/src/main/webui/public/img/portraits/jbosch.png diff --git a/opendc-web/opendc-web-ui/public/img/portraits/jburley.png b/opendc-web/opendc-web-server/src/main/webui/public/img/portraits/jburley.png Binary files differindex d2691659..d2691659 100644 --- a/opendc-web/opendc-web-ui/public/img/portraits/jburley.png +++ b/opendc-web/opendc-web-server/src/main/webui/public/img/portraits/jburley.png diff --git a/opendc-web/opendc-web-ui/public/img/portraits/lfdversluis.png b/opendc-web/opendc-web-server/src/main/webui/public/img/portraits/lfdversluis.png Binary files differindex 6fbc8472..6fbc8472 100644 --- a/opendc-web/opendc-web-ui/public/img/portraits/lfdversluis.png +++ b/opendc-web/opendc-web-server/src/main/webui/public/img/portraits/lfdversluis.png diff --git a/opendc-web/opendc-web-ui/public/img/portraits/loverweel.png b/opendc-web/opendc-web-server/src/main/webui/public/img/portraits/loverweel.png Binary files differindex 85865977..85865977 100644 --- a/opendc-web/opendc-web-ui/public/img/portraits/loverweel.png +++ b/opendc-web/opendc-web-server/src/main/webui/public/img/portraits/loverweel.png diff --git a/opendc-web/opendc-web-ui/public/img/portraits/sjounaid.png b/opendc-web/opendc-web-server/src/main/webui/public/img/portraits/sjounaid.png Binary files differindex 41878161..41878161 100644 --- a/opendc-web/opendc-web-ui/public/img/portraits/sjounaid.png +++ b/opendc-web/opendc-web-server/src/main/webui/public/img/portraits/sjounaid.png diff --git a/opendc-web/opendc-web-ui/public/img/portraits/vvanbeek.png b/opendc-web/opendc-web-server/src/main/webui/public/img/portraits/vvanbeek.png Binary files differindex 4c8b3311..4c8b3311 100644 --- a/opendc-web/opendc-web-ui/public/img/portraits/vvanbeek.png +++ b/opendc-web/opendc-web-server/src/main/webui/public/img/portraits/vvanbeek.png diff --git a/opendc-web/opendc-web-ui/public/img/portraits/wlai.png b/opendc-web/opendc-web-server/src/main/webui/public/img/portraits/wlai.png Binary files differindex c758846d..c758846d 100644 --- a/opendc-web/opendc-web-ui/public/img/portraits/wlai.png +++ b/opendc-web/opendc-web-server/src/main/webui/public/img/portraits/wlai.png diff --git a/opendc-web/opendc-web-ui/public/img/screenshot-construction.png b/opendc-web/opendc-web-server/src/main/webui/public/img/screenshot-construction.png Binary files differindex ea20a7c4..ea20a7c4 100644 --- a/opendc-web/opendc-web-ui/public/img/screenshot-construction.png +++ b/opendc-web/opendc-web-server/src/main/webui/public/img/screenshot-construction.png diff --git a/opendc-web/opendc-web-ui/public/img/screenshot-simulation.png b/opendc-web/opendc-web-server/src/main/webui/public/img/screenshot-simulation.png Binary files differindex 1bd989c7..1bd989c7 100644 --- a/opendc-web/opendc-web-ui/public/img/screenshot-simulation.png +++ b/opendc-web/opendc-web-server/src/main/webui/public/img/screenshot-simulation.png diff --git a/opendc-web/opendc-web-ui/public/img/stakeholders/Developer.png b/opendc-web/opendc-web-server/src/main/webui/public/img/stakeholders/Developer.png Binary files differindex d2638e6c..d2638e6c 100644 --- a/opendc-web/opendc-web-ui/public/img/stakeholders/Developer.png +++ b/opendc-web/opendc-web-server/src/main/webui/public/img/stakeholders/Developer.png diff --git a/opendc-web/opendc-web-ui/public/img/stakeholders/Manager.png b/opendc-web/opendc-web-server/src/main/webui/public/img/stakeholders/Manager.png Binary files differindex 92db7459..92db7459 100644 --- a/opendc-web/opendc-web-ui/public/img/stakeholders/Manager.png +++ b/opendc-web/opendc-web-server/src/main/webui/public/img/stakeholders/Manager.png diff --git a/opendc-web/opendc-web-ui/public/img/stakeholders/Researcher.png b/opendc-web/opendc-web-server/src/main/webui/public/img/stakeholders/Researcher.png Binary files differindex d87edd39..d87edd39 100644 --- a/opendc-web/opendc-web-ui/public/img/stakeholders/Researcher.png +++ b/opendc-web/opendc-web-server/src/main/webui/public/img/stakeholders/Researcher.png diff --git a/opendc-web/opendc-web-ui/public/img/stakeholders/Sales.png b/opendc-web/opendc-web-server/src/main/webui/public/img/stakeholders/Sales.png Binary files differindex 5b7c3a72..5b7c3a72 100644 --- a/opendc-web/opendc-web-ui/public/img/stakeholders/Sales.png +++ b/opendc-web/opendc-web-server/src/main/webui/public/img/stakeholders/Sales.png diff --git a/opendc-web/opendc-web-ui/public/img/stakeholders/Student.png b/opendc-web/opendc-web-server/src/main/webui/public/img/stakeholders/Student.png Binary files differindex a4900303..a4900303 100644 --- a/opendc-web/opendc-web-ui/public/img/stakeholders/Student.png +++ b/opendc-web/opendc-web-server/src/main/webui/public/img/stakeholders/Student.png diff --git a/opendc-web/opendc-web-ui/public/img/topology/cpu-icon.png b/opendc-web/opendc-web-server/src/main/webui/public/img/topology/cpu-icon.png Binary files differindex 07cfbd31..07cfbd31 100644 --- a/opendc-web/opendc-web-ui/public/img/topology/cpu-icon.png +++ b/opendc-web/opendc-web-server/src/main/webui/public/img/topology/cpu-icon.png diff --git a/opendc-web/opendc-web-ui/public/img/topology/gpu-icon.png b/opendc-web/opendc-web-server/src/main/webui/public/img/topology/gpu-icon.png Binary files differindex 55d4fb05..55d4fb05 100644 --- a/opendc-web/opendc-web-ui/public/img/topology/gpu-icon.png +++ b/opendc-web/opendc-web-server/src/main/webui/public/img/topology/gpu-icon.png diff --git a/opendc-web/opendc-web-ui/public/img/topology/memory-icon.png b/opendc-web/opendc-web-server/src/main/webui/public/img/topology/memory-icon.png Binary files differindex 36e8a44e..36e8a44e 100644 --- a/opendc-web/opendc-web-ui/public/img/topology/memory-icon.png +++ b/opendc-web/opendc-web-server/src/main/webui/public/img/topology/memory-icon.png diff --git a/opendc-web/opendc-web-ui/public/img/topology/rack-energy-icon.png b/opendc-web/opendc-web-server/src/main/webui/public/img/topology/rack-energy-icon.png Binary files differindex 1088c61b..1088c61b 100644 --- a/opendc-web/opendc-web-ui/public/img/topology/rack-energy-icon.png +++ b/opendc-web/opendc-web-server/src/main/webui/public/img/topology/rack-energy-icon.png diff --git a/opendc-web/opendc-web-ui/public/img/topology/rack-space-icon.png b/opendc-web/opendc-web-server/src/main/webui/public/img/topology/rack-space-icon.png Binary files differindex 387d7ea6..387d7ea6 100644 --- a/opendc-web/opendc-web-ui/public/img/topology/rack-space-icon.png +++ b/opendc-web/opendc-web-server/src/main/webui/public/img/topology/rack-space-icon.png diff --git a/opendc-web/opendc-web-ui/public/img/topology/storage-icon.png b/opendc-web/opendc-web-server/src/main/webui/public/img/topology/storage-icon.png Binary files differindex 7a39cb6f..7a39cb6f 100644 --- a/opendc-web/opendc-web-ui/public/img/topology/storage-icon.png +++ b/opendc-web/opendc-web-server/src/main/webui/public/img/topology/storage-icon.png diff --git a/opendc-web/opendc-web-ui/public/img/tudelft-icon.png b/opendc-web/opendc-web-server/src/main/webui/public/img/tudelft-icon.png Binary files differindex a7a2d56a..a7a2d56a 100644 --- a/opendc-web/opendc-web-ui/public/img/tudelft-icon.png +++ b/opendc-web/opendc-web-server/src/main/webui/public/img/tudelft-icon.png diff --git a/opendc-web/opendc-web-ui/public/manifest.json b/opendc-web/opendc-web-server/src/main/webui/public/manifest.json index adb82218..adb82218 100644 --- a/opendc-web/opendc-web-ui/public/manifest.json +++ b/opendc-web/opendc-web-server/src/main/webui/public/manifest.json diff --git a/opendc-web/opendc-web-ui/public/robots.txt b/opendc-web/opendc-web-server/src/main/webui/public/robots.txt index 1c6094ce..1c6094ce 100644 --- a/opendc-web/opendc-web-ui/public/robots.txt +++ b/opendc-web/opendc-web-server/src/main/webui/public/robots.txt diff --git a/opendc-web/opendc-web-ui/src/redux/actions/interaction-level.js b/opendc-web/opendc-web-server/src/main/webui/redux/actions/interaction-level.js index 8381eeef..8381eeef 100644 --- a/opendc-web/opendc-web-ui/src/redux/actions/interaction-level.js +++ b/opendc-web/opendc-web-server/src/main/webui/redux/actions/interaction-level.js diff --git a/opendc-web/opendc-web-ui/src/redux/actions/topology/building.js b/opendc-web/opendc-web-server/src/main/webui/redux/actions/topology/building.js index c12417b9..c12417b9 100644 --- a/opendc-web/opendc-web-ui/src/redux/actions/topology/building.js +++ b/opendc-web/opendc-web-server/src/main/webui/redux/actions/topology/building.js diff --git a/opendc-web/opendc-web-ui/src/redux/actions/topology/index.js b/opendc-web/opendc-web-server/src/main/webui/redux/actions/topology/index.js index d48af37a..d48af37a 100644 --- a/opendc-web/opendc-web-ui/src/redux/actions/topology/index.js +++ b/opendc-web/opendc-web-server/src/main/webui/redux/actions/topology/index.js diff --git a/opendc-web/opendc-web-ui/src/redux/actions/topology/machine.js b/opendc-web/opendc-web-server/src/main/webui/redux/actions/topology/machine.js index 93320884..93320884 100644 --- a/opendc-web/opendc-web-ui/src/redux/actions/topology/machine.js +++ b/opendc-web/opendc-web-server/src/main/webui/redux/actions/topology/machine.js diff --git a/opendc-web/opendc-web-ui/src/redux/actions/topology/rack.js b/opendc-web/opendc-web-server/src/main/webui/redux/actions/topology/rack.js index 1f65952a..1f65952a 100644 --- a/opendc-web/opendc-web-ui/src/redux/actions/topology/rack.js +++ b/opendc-web/opendc-web-server/src/main/webui/redux/actions/topology/rack.js diff --git a/opendc-web/opendc-web-ui/src/redux/actions/topology/room.js b/opendc-web/opendc-web-server/src/main/webui/redux/actions/topology/room.js index 14cc126c..14cc126c 100644 --- a/opendc-web/opendc-web-ui/src/redux/actions/topology/room.js +++ b/opendc-web/opendc-web-server/src/main/webui/redux/actions/topology/room.js diff --git a/opendc-web/opendc-web-ui/src/redux/index.js b/opendc-web/opendc-web-server/src/main/webui/redux/index.js index 53cd9144..53cd9144 100644 --- a/opendc-web/opendc-web-ui/src/redux/index.js +++ b/opendc-web/opendc-web-server/src/main/webui/redux/index.js diff --git a/opendc-web/opendc-web-ui/src/redux/reducers/construction-mode.js b/opendc-web/opendc-web-server/src/main/webui/redux/reducers/construction-mode.js index d0aac5ae..d0aac5ae 100644 --- a/opendc-web/opendc-web-ui/src/redux/reducers/construction-mode.js +++ b/opendc-web/opendc-web-server/src/main/webui/redux/reducers/construction-mode.js diff --git a/opendc-web/opendc-web-ui/src/redux/reducers/index.js b/opendc-web/opendc-web-server/src/main/webui/redux/reducers/index.js index 7ffb1211..7ffb1211 100644 --- a/opendc-web/opendc-web-ui/src/redux/reducers/index.js +++ b/opendc-web/opendc-web-server/src/main/webui/redux/reducers/index.js diff --git a/opendc-web/opendc-web-ui/src/redux/reducers/interaction-level.js b/opendc-web/opendc-web-server/src/main/webui/redux/reducers/interaction-level.js index b30c68b9..b30c68b9 100644 --- a/opendc-web/opendc-web-ui/src/redux/reducers/interaction-level.js +++ b/opendc-web/opendc-web-server/src/main/webui/redux/reducers/interaction-level.js diff --git a/opendc-web/opendc-web-ui/src/redux/reducers/topology/index.js b/opendc-web/opendc-web-server/src/main/webui/redux/reducers/topology/index.js index 2c849387..2c849387 100644 --- a/opendc-web/opendc-web-ui/src/redux/reducers/topology/index.js +++ b/opendc-web/opendc-web-server/src/main/webui/redux/reducers/topology/index.js diff --git a/opendc-web/opendc-web-ui/src/redux/reducers/topology/machine.js b/opendc-web/opendc-web-server/src/main/webui/redux/reducers/topology/machine.js index 1789257b..1789257b 100644 --- a/opendc-web/opendc-web-ui/src/redux/reducers/topology/machine.js +++ b/opendc-web/opendc-web-server/src/main/webui/redux/reducers/topology/machine.js diff --git a/opendc-web/opendc-web-ui/src/redux/reducers/topology/rack.js b/opendc-web/opendc-web-server/src/main/webui/redux/reducers/topology/rack.js index ca79348a..ca79348a 100644 --- a/opendc-web/opendc-web-ui/src/redux/reducers/topology/rack.js +++ b/opendc-web/opendc-web-server/src/main/webui/redux/reducers/topology/rack.js diff --git a/opendc-web/opendc-web-ui/src/redux/reducers/topology/room.js b/opendc-web/opendc-web-server/src/main/webui/redux/reducers/topology/room.js index c05c8bfa..c05c8bfa 100644 --- a/opendc-web/opendc-web-ui/src/redux/reducers/topology/room.js +++ b/opendc-web/opendc-web-server/src/main/webui/redux/reducers/topology/room.js diff --git a/opendc-web/opendc-web-ui/src/redux/reducers/topology/tile.js b/opendc-web/opendc-web-server/src/main/webui/redux/reducers/topology/tile.js index 24c0e20c..24c0e20c 100644 --- a/opendc-web/opendc-web-ui/src/redux/reducers/topology/tile.js +++ b/opendc-web/opendc-web-server/src/main/webui/redux/reducers/topology/tile.js diff --git a/opendc-web/opendc-web-ui/src/redux/reducers/topology/topology.js b/opendc-web/opendc-web-server/src/main/webui/redux/reducers/topology/topology.js index dff0a69e..dff0a69e 100644 --- a/opendc-web/opendc-web-ui/src/redux/reducers/topology/topology.js +++ b/opendc-web/opendc-web-server/src/main/webui/redux/reducers/topology/topology.js diff --git a/opendc-web/opendc-web-ui/src/redux/sagas/index.js b/opendc-web/opendc-web-server/src/main/webui/redux/sagas/index.js index 0fabdb6d..0fabdb6d 100644 --- a/opendc-web/opendc-web-ui/src/redux/sagas/index.js +++ b/opendc-web/opendc-web-server/src/main/webui/redux/sagas/index.js diff --git a/opendc-web/opendc-web-ui/src/redux/sagas/topology.js b/opendc-web/opendc-web-server/src/main/webui/redux/sagas/topology.js index 15147bcf..15147bcf 100644 --- a/opendc-web/opendc-web-ui/src/redux/sagas/topology.js +++ b/opendc-web/opendc-web-server/src/main/webui/redux/sagas/topology.js diff --git a/opendc-web/opendc-web-ui/src/shapes.js b/opendc-web/opendc-web-server/src/main/webui/shapes.js index 50b82361..50b82361 100644 --- a/opendc-web/opendc-web-ui/src/shapes.js +++ b/opendc-web/opendc-web-server/src/main/webui/shapes.js diff --git a/opendc-web/opendc-web-ui/src/style/index.css b/opendc-web/opendc-web-server/src/main/webui/style/index.css index 7b7103a4..7b7103a4 100644 --- a/opendc-web/opendc-web-ui/src/style/index.css +++ b/opendc-web/opendc-web-server/src/main/webui/style/index.css diff --git a/opendc-web/opendc-web-ui/src/util/authorizations.js b/opendc-web/opendc-web-server/src/main/webui/util/authorizations.js index 6cb08ba8..6cb08ba8 100644 --- a/opendc-web/opendc-web-ui/src/util/authorizations.js +++ b/opendc-web/opendc-web-server/src/main/webui/util/authorizations.js diff --git a/opendc-web/opendc-web-ui/src/util/available-metrics.js b/opendc-web/opendc-web-server/src/main/webui/util/available-metrics.js index fda6cd4d..fda6cd4d 100644 --- a/opendc-web/opendc-web-ui/src/util/available-metrics.js +++ b/opendc-web/opendc-web-server/src/main/webui/util/available-metrics.js diff --git a/opendc-web/opendc-web-ui/src/util/colors.js b/opendc-web/opendc-web-server/src/main/webui/util/colors.js index 34468503..34468503 100644 --- a/opendc-web/opendc-web-ui/src/util/colors.js +++ b/opendc-web/opendc-web-server/src/main/webui/util/colors.js diff --git a/opendc-web/opendc-web-ui/src/util/date-time.js b/opendc-web/opendc-web-server/src/main/webui/util/date-time.js index 7e2f6623..7e2f6623 100644 --- a/opendc-web/opendc-web-ui/src/util/date-time.js +++ b/opendc-web/opendc-web-server/src/main/webui/util/date-time.js diff --git a/opendc-web/opendc-web-ui/src/util/date-time.test.js b/opendc-web/opendc-web-server/src/main/webui/util/date-time.test.js index 431e39f7..431e39f7 100644 --- a/opendc-web/opendc-web-ui/src/util/date-time.test.js +++ b/opendc-web/opendc-web-server/src/main/webui/util/date-time.test.js diff --git a/opendc-web/opendc-web-ui/src/util/effect-ref.js b/opendc-web/opendc-web-server/src/main/webui/util/effect-ref.js index 78528585..78528585 100644 --- a/opendc-web/opendc-web-ui/src/util/effect-ref.js +++ b/opendc-web/opendc-web-server/src/main/webui/util/effect-ref.js diff --git a/opendc-web/opendc-web-ui/src/util/tile-calculations.js b/opendc-web/opendc-web-server/src/main/webui/util/tile-calculations.js index 374ca48c..374ca48c 100644 --- a/opendc-web/opendc-web-ui/src/util/tile-calculations.js +++ b/opendc-web/opendc-web-server/src/main/webui/util/tile-calculations.js diff --git a/opendc-web/opendc-web-ui/src/util/topology-schema.js b/opendc-web/opendc-web-server/src/main/webui/util/topology-schema.js index ff672dd6..ff672dd6 100644 --- a/opendc-web/opendc-web-ui/src/util/topology-schema.js +++ b/opendc-web/opendc-web-server/src/main/webui/util/topology-schema.js diff --git a/opendc-web/opendc-web-ui/src/util/unit-specifications.js b/opendc-web/opendc-web-server/src/main/webui/util/unit-specifications.js index 3e3671cd..3e3671cd 100644 --- a/opendc-web/opendc-web-ui/src/util/unit-specifications.js +++ b/opendc-web/opendc-web-server/src/main/webui/util/unit-specifications.js diff --git a/opendc-web/opendc-web-server/src/test/java/org/opendc/web/server/service/UserAccountingServiceTest.java b/opendc-web/opendc-web-server/src/test/java/org/opendc/web/server/service/UserAccountingServiceTest.java index 91e3eb66..f4a8c9d6 100644 --- a/opendc-web/opendc-web-server/src/test/java/org/opendc/web/server/service/UserAccountingServiceTest.java +++ b/opendc-web/opendc-web-server/src/test/java/org/opendc/web/server/service/UserAccountingServiceTest.java @@ -68,8 +68,8 @@ public class UserAccountingServiceTest { var accounting = service.getAccounting(userId); - assertTrue(accounting.getPeriodEnd().isAfter(LocalDate.now())); - assertEquals(0, accounting.getSimulationTime()); + assertTrue(accounting.periodEnd().isAfter(LocalDate.now())); + assertEquals(0, accounting.simulationTime()); } @Test @@ -85,9 +85,9 @@ public class UserAccountingServiceTest { var accounting = service.getAccounting(userId); assertAll( - () -> assertEquals(periodEnd, accounting.getPeriodEnd()), - () -> assertEquals(32, accounting.getSimulationTime()), - () -> assertEquals(3600, accounting.getSimulationTimeBudget())); + () -> assertEquals(periodEnd, accounting.periodEnd()), + () -> assertEquals(32, accounting.simulationTime()), + () -> assertEquals(3600, accounting.simulationTimeBudget())); } @Test diff --git a/opendc-web/opendc-web-ui-quarkus-deployment/src/main/java/org/opendc/web/ui/deployment/OpenDCUiProcessor.java b/opendc-web/opendc-web-ui-quarkus-deployment/src/main/java/org/opendc/web/ui/deployment/OpenDCUiProcessor.java deleted file mode 100644 index 5733e0db..00000000 --- a/opendc-web/opendc-web-ui-quarkus-deployment/src/main/java/org/opendc/web/ui/deployment/OpenDCUiProcessor.java +++ /dev/null @@ -1,301 +0,0 @@ -/* - * Copyright (c) 2022 AtLarge Research - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package org.opendc.web.ui.deployment; - -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import io.quarkus.deployment.annotations.BuildProducer; -import io.quarkus.deployment.annotations.BuildStep; -import io.quarkus.deployment.annotations.ExecutionTime; -import io.quarkus.deployment.annotations.Record; -import io.quarkus.deployment.builditem.FeatureBuildItem; -import io.quarkus.deployment.builditem.ShutdownContextBuildItem; -import io.quarkus.deployment.pkg.builditem.CurateOutcomeBuildItem; -import io.quarkus.maven.dependency.GACT; -import io.quarkus.maven.dependency.ResolvedDependency; -import io.quarkus.paths.PathVisit; -import io.quarkus.vertx.http.deployment.HttpRootPathBuildItem; -import io.quarkus.vertx.http.deployment.RouteBuildItem; -import io.quarkus.vertx.http.deployment.webjar.WebJarBuildItem; -import io.quarkus.vertx.http.deployment.webjar.WebJarResourcesFilter; -import io.quarkus.vertx.http.deployment.webjar.WebJarResultsBuildItem; -import io.vertx.core.Handler; -import io.vertx.ext.web.RoutingContext; -import java.io.*; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.function.BooleanSupplier; -import java.util.function.Function; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import org.opendc.web.ui.runtime.OpenDCUiRecorder; -import org.opendc.web.ui.runtime.OpenDCUiRuntimeConfig; - -/** - * Build processor for the OpenDC web UI Quarkus extension. - */ -public class OpenDCUiProcessor { - - private static final String FEATURE = "opendc-ui"; - private static final GACT OPENDC_UI_WEBJAR_ARTIFACT_KEY = new GACT("org.opendc.web", "opendc-web-ui", null, "jar"); - private static final String OPENDC_UI_WEBJAR_STATIC_RESOURCES_PATH = "META-INF/resources/opendc-web-ui"; - private static final Pattern PATH_PARAM_PATTERN = Pattern.compile("\\[(\\w+)]"); - - private final ObjectMapper objectMapper = new ObjectMapper(); - - /** - * Provide the {@link FeatureBuildItem} for this Quarkus extension. - */ - @BuildStep(onlyIf = IsIncluded.class) - public FeatureBuildItem feature() { - return new FeatureBuildItem(FEATURE); - } - - /** - * Build the WebJar that is used to serve the Next.js resources. - */ - @BuildStep(onlyIf = IsIncluded.class) - public WebJarBuildItem buildWebJar(OpenDCUiConfig config) { - return WebJarBuildItem.builder() - .artifactKey(OPENDC_UI_WEBJAR_ARTIFACT_KEY) - .root(OPENDC_UI_WEBJAR_STATIC_RESOURCES_PATH) - .onlyCopyNonArtifactFiles(false) - .useDefaultQuarkusBranding(false) - .filter(new InsertVariablesResourcesFilter(config)) - .build(); - } - - /** - * Build the Next.js routes based on the route manifest generated by it. - */ - @BuildStep(onlyIf = IsIncluded.class) - public OpenDCUiRoutingBuildItem buildRoutes(CurateOutcomeBuildItem curateOutcomeBuildItem) throws IOException { - ResolvedDependency dependency = getAppArtifact(curateOutcomeBuildItem, OPENDC_UI_WEBJAR_ARTIFACT_KEY); - PathVisit visit = dependency - .getContentTree() - .apply(OPENDC_UI_WEBJAR_STATIC_RESOURCES_PATH + "/routes-manifest.json", v -> v); - - if (visit == null) { - throw new FileNotFoundException("Cannot find routes-manifest.json"); - } - - JsonNode routeManifest = objectMapper.readTree(visit.getUrl()); - - var pages = new ArrayList<OpenDCUiRoutingBuildItem.Page>(); - for (Iterator<JsonNode> it = routeManifest.get("staticRoutes").elements(); it.hasNext(); ) { - JsonNode route = it.next(); - - String page = route.get("page").asText(); - - // Static routes do not have any path parameters - pages.add(new OpenDCUiRoutingBuildItem.Page(page, page)); - } - - for (Iterator<JsonNode> it = routeManifest.get("dynamicRoutes").elements(); it.hasNext(); ) { - JsonNode route = it.next(); - - String page = route.get("page").asText(); - String path = PATH_PARAM_PATTERN.matcher(page).replaceAll(r -> ":" + r.group(1)); - - pages.add(new OpenDCUiRoutingBuildItem.Page(path, page)); - } - - var redirects = new ArrayList<OpenDCUiRoutingBuildItem.Redirect>(); - for (Iterator<JsonNode> it = routeManifest.get("redirects").elements(); it.hasNext(); ) { - JsonNode redirect = it.next(); - if (redirect.has("internal")) { - continue; - } - - int statusCode = redirect.get("statusCode").asInt(); - String path = redirect.get("source").asText(); - String destination = redirect.get("destination").asText(); - - if (path.isEmpty()) { - path = "/"; - } - - redirects.add(new OpenDCUiRoutingBuildItem.Redirect(path, destination, statusCode)); - } - - var custom404 = routeManifest.get("pages404").asBoolean(); - return new OpenDCUiRoutingBuildItem(pages, redirects, custom404); - } - - /** - * Register the HTTP handles for the OpenDC web UI. - */ - @BuildStep(onlyIf = IsIncluded.class) - @Record(ExecutionTime.RUNTIME_INIT) - public void registerOpenDCUiHandler( - OpenDCUiRecorder recorder, - BuildProducer<RouteBuildItem> routes, - HttpRootPathBuildItem httpRootPathBuildItem, - WebJarResultsBuildItem webJarResultsBuildItem, - OpenDCUiRoutingBuildItem openDCUiBuildItem, - OpenDCUiRuntimeConfig runtimeConfig, - ShutdownContextBuildItem shutdownContext) { - - WebJarResultsBuildItem.WebJarResult result = - webJarResultsBuildItem.byArtifactKey(OPENDC_UI_WEBJAR_ARTIFACT_KEY); - if (result == null) { - return; - } - - String basePath = httpRootPathBuildItem.getRootPath(); - String finalDestination = result.getFinalDestination(); - - /* Construct dynamic routes */ - for (var redirect : openDCUiBuildItem.getRedirects()) { - String destination = - basePath.equals("/") ? redirect.getDestination() : basePath + redirect.getDestination(); - - routes.produce(httpRootPathBuildItem - .routeBuilder() - .route(basePath + redirect.getPath()) - .handler(recorder.redirectHandler(destination, redirect.getStatusCode(), runtimeConfig)) - .build()); - } - - for (var page : openDCUiBuildItem.getPages()) { - routes.produce(httpRootPathBuildItem - .routeBuilder() - .route(basePath + page.getPath()) - .handler(recorder.pageHandler(finalDestination, page.getName(), runtimeConfig)) - .build()); - } - - /* Construct static routes */ - Handler<RoutingContext> staticHandler = recorder.staticHandler( - finalDestination, basePath, result.getWebRootConfigurations(), runtimeConfig, shutdownContext); - - routes.produce(httpRootPathBuildItem - .routeBuilder() - .route("*") - .handler(staticHandler) - .build()); - } - - /** - * A {@link WebJarResourcesFilter} that instantiates the variables in the web jar resource. - */ - private static class InsertVariablesResourcesFilter implements WebJarResourcesFilter { - - private static final String HTML = ".html"; - private static final String CSS = ".css"; - private static final String JS = ".js"; - - private final OpenDCUiConfig config; - - public InsertVariablesResourcesFilter(OpenDCUiConfig config) { - this.config = config; - } - - @Override - public FilterResult apply(String fileName, InputStream stream) throws IOException { - if (stream == null) { - return new FilterResult(null, false); - } - - // Allow replacement of variables in HTML, CSS, and JavaScript files - if (fileName.endsWith(HTML) || fileName.endsWith(CSS) || fileName.endsWith(JS)) { - byte[] oldContentBytes = stream.readAllBytes(); - String oldContents = new String(oldContentBytes); - String contents = substituteVariables(oldContents, this::substitute); - - boolean changed = contents.length() != oldContents.length() || !contents.equals(oldContents); - if (changed) { - return new FilterResult(new ByteArrayInputStream(contents.getBytes()), true); - } else { - return new FilterResult(new ByteArrayInputStream(oldContentBytes), false); - } - } - - return new FilterResult(stream, false); - } - - private String substitute(String var) { - switch (var) { - case "NEXT_PUBLIC_API_BASE_URL": - return config.apiBaseUrl; - case "NEXT_PUBLIC_SENTRY_DSN": - return config.sentryDsn.orElse(""); - case "NEXT_PUBLIC_AUTH0_DOMAIN": - return config.auth.domain.orElse(""); - case "NEXT_PUBLIC_AUTH0_CLIENT_ID": - return config.auth.clientId.orElse(""); - case "NEXT_PUBLIC_AUTH0_AUDIENCE": - return config.auth.audience.orElse(""); - default: - return null; - } - } - - /** - * Pattern to match variables in the OpenDC web UI sources specified using the following format: "%%VAR_NAME%%". - * <p> - * Be aware that to properly handle Next.js base path, we need to also match a possible forward slash in front - * of the variable. - */ - private static final Pattern PATTERN = Pattern.compile("%%(\\w+)%%"); - - /** - * Helper method to substitute variables in the OpenDC web UI. - */ - private static String substituteVariables(String contents, Function<String, String> substitute) { - Matcher m = PATTERN.matcher(contents); - StringBuilder sb = new StringBuilder(); - - while (m.find()) { - String group = m.group(1); - String val = substitute.apply(group); - m.appendReplacement(sb, val != null ? val : group); - } - - m.appendTail(sb); - return sb.toString(); - } - } - - /** - * A {@link BooleanSupplier} to determine if the OpenDC web UI extension should be included. - */ - private static class IsIncluded implements BooleanSupplier { - OpenDCUiConfig config; - - @Override - public boolean getAsBoolean() { - return config.include; - } - } - - private static ResolvedDependency getAppArtifact(CurateOutcomeBuildItem curateOutcomeBuildItem, GACT artifactKey) { - for (ResolvedDependency dep : - curateOutcomeBuildItem.getApplicationModel().getDependencies()) { - if (dep.getKey().equals(artifactKey)) { - return dep; - } - } - throw new RuntimeException("Could not find artifact " + artifactKey + " among the application dependencies"); - } -} diff --git a/opendc-web/opendc-web-ui-quarkus/src/main/java/org/opendc/web/ui/runtime/OpenDCUiRecorder.java b/opendc-web/opendc-web-ui-quarkus/src/main/java/org/opendc/web/ui/runtime/OpenDCUiRecorder.java deleted file mode 100644 index 03fedd4f..00000000 --- a/opendc-web/opendc-web-ui-quarkus/src/main/java/org/opendc/web/ui/runtime/OpenDCUiRecorder.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright (c) 2022 AtLarge Research - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package org.opendc.web.ui.runtime; - -import io.quarkus.runtime.ShutdownContext; -import io.quarkus.runtime.annotations.Recorder; -import io.quarkus.vertx.http.runtime.devmode.FileSystemStaticHandler; -import io.quarkus.vertx.http.runtime.webjar.WebJarNotFoundHandler; -import io.quarkus.vertx.http.runtime.webjar.WebJarStaticHandler; -import io.vertx.core.Handler; -import io.vertx.ext.web.RoutingContext; -import java.util.List; -import java.util.stream.Collectors; - -/** - * Helper class for serving the OpenDC web interface. - */ -@Recorder -public class OpenDCUiRecorder { - /** - * Construct a {@link Handler} for serving a page of the OpenDC web interface. - */ - public Handler<RoutingContext> pageHandler( - String finalDestination, String page, OpenDCUiRuntimeConfig runtimeConfig) { - if (runtimeConfig.enable) { - String pageDirectory = finalDestination + "/pages"; - return (event) -> { - event.response().setStatusCode(200).sendFile(pageDirectory + page + ".html"); - }; - } - - return new WebJarNotFoundHandler(); - } - - /** - * Construct a {@link Handler} for handling redirects in the OpenDC web interface. - */ - public Handler<RoutingContext> redirectHandler( - String destination, int statusCode, OpenDCUiRuntimeConfig runtimeConfig) { - if (runtimeConfig.enable) { - return (event) -> { - String query = event.request().query(); - String fullDestination = query != null ? destination + "?" + query : destination; - - event.response() - .setStatusCode(statusCode) - .putHeader("Location", fullDestination) - .end(); - }; - } - - return new WebJarNotFoundHandler(); - } - - /** - * Construct a {@link Handler} for serving the static files of the OpenDC web interface. - */ - public Handler<RoutingContext> staticHandler( - String finalDestination, - String path, - List<FileSystemStaticHandler.StaticWebRootConfiguration> webRootConfigurations, - OpenDCUiRuntimeConfig runtimeConfig, - ShutdownContext shutdownContext) { - if (runtimeConfig.enable) { - var augmentedWebRootConfigurations = webRootConfigurations.stream() - .map(c -> new FileSystemStaticHandler.StaticWebRootConfiguration( - c.getFileSystem(), c.getWebRoot().isEmpty() ? "static" : c.getWebRoot() + "/static")) - .collect(Collectors.toList()); - - WebJarStaticHandler handler = - new WebJarStaticHandler(finalDestination + "/static", path, augmentedWebRootConfigurations); - shutdownContext.addShutdownTask(new ShutdownContext.CloseRunnable(handler)); - return handler; - } - - return new WebJarNotFoundHandler(); - } -} diff --git a/opendc-web/opendc-web-ui-quarkus/src/main/java/org/opendc/web/ui/runtime/OpenDCUiRuntimeConfig.java b/opendc-web/opendc-web-ui-quarkus/src/main/java/org/opendc/web/ui/runtime/OpenDCUiRuntimeConfig.java deleted file mode 100644 index 8ae3b6a2..00000000 --- a/opendc-web/opendc-web-ui-quarkus/src/main/java/org/opendc/web/ui/runtime/OpenDCUiRuntimeConfig.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (c) 2022 AtLarge Research - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -package org.opendc.web.ui.runtime; - -import io.quarkus.runtime.annotations.ConfigItem; -import io.quarkus.runtime.annotations.ConfigPhase; -import io.quarkus.runtime.annotations.ConfigRoot; - -/** - * Configuration for the OpenDC web UI. - */ -@ConfigRoot(phase = ConfigPhase.RUN_TIME, name = "opendc-ui") -public class OpenDCUiRuntimeConfig { - /** - * Flag to indicate whether the web interface should be served by the OpenDC API server. - */ - @ConfigItem(defaultValue = "true") - public boolean enable; -} diff --git a/opendc-web/opendc-web-ui/build.gradle.kts b/opendc-web/opendc-web-ui/build.gradle.kts deleted file mode 100644 index 777098d4..00000000 --- a/opendc-web/opendc-web-ui/build.gradle.kts +++ /dev/null @@ -1,144 +0,0 @@ -/* - * Copyright (c) 2021 AtLarge Research - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -import com.github.gradle.node.npm.task.NpmTask - -description = "Web interface for OpenDC" - -plugins { - `java-conventions` - id("com.github.node-gradle.node") -} - -sourceSets { - main { - java.srcDir("src") - } - test { - java.srcDir("test") - } -} - -node { - download.set(true) - version.set(libs.versions.node.get()) -} - -val formatTask = - tasks.register<NpmTask>("prettierFormat") { - group = "formatting" - description = "Use Prettier to format the JavaScript codebase" - - args.set(listOf("run", "format")) - dependsOn(tasks.npmInstall) - inputs.dir("src") - inputs.files("package.json", "next.config.js", ".prettierrc.yaml") - outputs.upToDateWhen { true } - } - -val lintTask = - tasks.register<NpmTask>("nextLint") { - group = "verification" - description = "Use ESLint to check for problems" - - args.set(listOf("run", "lint")) - dependsOn(tasks.npmInstall) - inputs.dir("src") - inputs.files("package.json", "next.config.js", ".eslintrc") - outputs.upToDateWhen { true } - } - -tasks.register<NpmTask>("nextDev") { - group = "build" - description = "Run the Next.js project in development mode" - - args.set(listOf("run", "dev")) - dependsOn(tasks.npmInstall) - inputs.dir(project.fileTree("src")) - inputs.dir("node_modules") - inputs.files("package.json", "next.config.js") - outputs.upToDateWhen { true } -} - -val buildTask = - tasks.register<NpmTask>("nextBuild") { - group = "build" - description = "Build the Next.js project" - - args.set(listOf("run", "build")) - - val env = - listOf( - "NEXT_PUBLIC_API_BASE_URL", - "NEXT_PUBLIC_SENTRY_DSN", - "NEXT_PUBLIC_AUTH0_DOMAIN", - "NEXT_PUBLIC_AUTH0_CLIENT_ID", - "NEXT_PUBLIC_AUTH0_AUDIENCE", - ) - for (envvar in env) { - environment.put(envvar, "%%$envvar%%") - } - - dependsOn(tasks.npmInstall) - inputs.dir(project.fileTree("src")) - inputs.dir("node_modules") - inputs.files("package.json", "next.config.js") - outputs.dir(layout.buildDirectory.dir("next")) - } - -tasks.register<NpmTask>("nextStart") { - group = "build" - description = "Build the Next.js project" - - args.set(listOf("run", "start")) - - dependsOn(buildTask) - dependsOn(tasks.npmInstall) - - inputs.dir(project.fileTree("src")) - inputs.dir("node_modules") - inputs.files("package.json", "next.config.js") - outputs.upToDateWhen { true } -} - -tasks.processResources { - dependsOn(buildTask) - inputs.dir(project.fileTree("public")) - - from(layout.buildDirectory.dir("next")) { - include("routes-manifest.json") - into("META-INF/resources/${project.name}") - } - - from(layout.buildDirectory.dir("next/static")) { - into("META-INF/resources/${project.name}/static/_next/static") - } - - from(layout.buildDirectory.dir("next/server/pages")) { - include("**/*.html") - into("META-INF/resources/${project.name}/pages") - } - - from(project.fileTree("public")) { - into("META-INF/resources/${project.name}/static") - } -} diff --git a/opendc-web/opendc-web-ui/scripts/envsubst.sh b/opendc-web/opendc-web-ui/scripts/envsubst.sh deleted file mode 100755 index afc976ed..00000000 --- a/opendc-web/opendc-web-ui/scripts/envsubst.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/sh - -set -e - -auto_envsubst() { - input_path="build/next.template" - output_path="build/next" - - cp -r "$input_path" "$output_path" - find "$output_path" -type f -name '*.js' -exec perl -pi -e 's/%%(NEXT_PUBLIC_[_A-Z0-9]+)%%/$ENV{$1}/g' {} \; -} - -auto_envsubst -exit 0 diff --git a/settings.gradle.kts b/settings.gradle.kts index 139dbd7e..38478afe 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -42,14 +42,11 @@ include(":opendc-experiments:opendc-experiments-tf20") include(":opendc-experiments:opendc-experiments-m3sa") include(":opendc-web") include(":opendc-web:opendc-web-proto") -include(":opendc-web:opendc-web-server") include(":opendc-web:opendc-web-client") -include(":opendc-web:opendc-web-ui") -include(":opendc-web:opendc-web-ui-quarkus") -include(":opendc-web:opendc-web-ui-quarkus-deployment") +include(":opendc-web:opendc-web-server") include(":opendc-web:opendc-web-runner") -include(":opendc-web:opendc-web-runner-quarkus") -include(":opendc-web:opendc-web-runner-quarkus-deployment") +include(":opendc-web:opendc-web-quarkus") +include(":opendc-web:opendc-web-quarkus-deployment") include(":opendc-simulator:opendc-simulator-core") include(":opendc-simulator:opendc-simulator-flow") include(":opendc-simulator:opendc-simulator-compute") |
